2016-07-10 3 views
0

私はbashコマンドを使ってforループでインクリメントする方法をいくつか試しました。 $ VARがループを通過するたびに、リセットされます。 letとletを使用せずに両方の出力を追加しました。私はなぜそれをdoesnt does doesn使っていないのか分かりません。

それは次のように書き出されていますとき、私のコードが正しく動作:

echo "Initial value: $VAR" 
for file in a b c; do 
    VAR=$((VAR+1)) 
    echo "Incremented" 
done 
echo "Final value: $VAR" 

が、それは次のように動作しません。

echo "Initial value: $VAR" 
for file in a b c; do VAR=$((VAR+1)) echo "Incremented"; done 
echo "Final value: $VAR" 

同様に、私はletを使用する場合、それは動作します:

for file in a b c; do let VAR++; echo "Incremented"; done 

違いは何ですか?

+0

これはbashで使用されるコマンドです。私は、各反復ごとに値を印刷して、それに常に「ヒット」という単語を含むファイルに1を表示しました。 –

+0

私はそうは思わない。私は2011年からMacを持っています。私は標準がbashだと思っています。あなたはどちらの時にも出力を表示します –

+0

Macはbash 3.2を使用するべきですが、これはかなり古いですが、標準のPOSIX数学構文をサポートします。 –

答えて

2

問題は実際にあなたが1つのライナーに物を壊す方法にあります。あなたのコードは、これに相当します

for file in *.dat; do 
    printf "$file " 
    if grep -q 'hit' "$file"; then 
    HITS=$((HITS+1)) 
    echo "hit" 
    else 
    MISSES=$((MISSES+1)) echo "miss" 
    fi 
done 

が、これはすべて1行で...

MISSES=$((MISSES+1)) echo "miss" 

を持っているかを参照してください?それがあなたのバグです。 ...以前のバージョンはechoコマンドの期間中、環境にMISSESの新しい値をエクスポートしますが、その範囲外でそれを変更しない

MISSES=$((MISSES+1)); echo "miss" 

;:セミコロン、または改行を追加します。後者は実際にそれを更新する。

+0

ありがとうございます。 '使っているのは悪い習慣だ?'また、私はあなたのコメントをupvoteすることができるようになる2つ以上の担当者を得る。 –

+1

私は* bad *とは言いませんが、これは古きよき習慣です - 現代のシェルをターゲットとする新しいコードには好まれません。 –

関連する問題