2009-08-10 18 views
4

ループ内から変数を渡すのに問題があります。Unixシェルスクリプトの変数の問題

コード:0 = PROCESSED作り方任意のアイデア1.

# find all output.txt that has been modified last 24h ... 
PROCESSED=1 
find ${PROCESSED_DIR} -mtime -1 -name "output.txt" | while read i 
do 
    # .. and compare those with TMP_TXT 
    if diff $i ${TMP_TXT} > /dev/null 
    then 
     # If both are same EXIT search loop 
     PROCESSED=0 
     exit 
    fi 
done 
echo "PROCESSED=${PROCESSED}" 

これます常に出力?

これはSolaris 9マシンで行われます。

答えて

6

while -commandはパイプ内で実行されるため、サブシェル内で実行されているため、変数の割り当ては呼び出し元のシェルに伝播されません。

一つの解決策は、(あなたが最初の一時ファイルに書き込む必要があるかもしれません)入力をリダイレクトすることです:

while read f; do 
    ... 
done < foo.tmp 

別の解決策は、PROCESSEDの値を伝播する間、コマンドからの標準出力を使用することです:

PROCESSED=`find | while read f; do 
    echo "Echo other stuff on stderr" >&2 
    echo 1 
done` 
+0

ありがとうございました! :D –

0

PROCESSED=0 

は、によって実行されますシェルのコマンドではなく、パイプの一部としてのwhileコマンド。 あなたの代わりにxargsのを使用して、シェルスクリプトで処理変数を更新するために

find ${PROCESSED_DIR} -mtime -1 -name "output.txt" | xargs -n1 your_compare_script.sh && PROCESSED=0 

を使用することができ、適切な戻り値を返す別のシェルスクリプトにあなたのwhileループとの比較を置く場合。

0

あなたは、呼び出し元のシェルにこの種の情報を渡すためにサブシェルの戻り値を使用することができます。

 
#!/bin/sh 

find $PROCESSED_DIR -type f | { 
    while read -r i; do 
     cmp "$i" "$TMP_TXT" > /dev/null && exit 0; 
    done; 
    exit 1; 
} 
PROCESSED=$? 
echo $PROCESSED 

# or, if you want to detect the filename as well: 

filename=$(find $PROCESSED_DIR -type f | { 
    while read -r i; do 
     if cmp "$i" "$TMP_TXT" > /dev/null; then 
      echo $i; 
      exit 0; 
     fi 
    done; 
    exit 1; 
}) 
PROCESSED=$? 
echo $PROCESSED: $filename 

0

問題は、使用しているシェルです。あなたがshをしていれば、あなたが望むように処理することはできませんが、kshをするとうまくいくでしょう。

+0

ようこそ。返信いただきありがとうございますが、回答をより正確にするためのコードやリンクを提供することができれば、他のユーザーにとっては本当に便利です! – Luv

関連する問題