GNU/Linux >> Linux の 問題 >  >> Linux

Bash ループのカウンター インクリメントが機能しない

まず、カウンターを増やしていません。 COUNTER=$((COUNTER)) の変更 COUNTER=$((COUNTER + 1)) に または COUNTER=$[COUNTER + 1] 増加します。

第二に、サブシェル変数を呼び出し先に逆伝播するのは難しいと思います。サブシェル内の変数は、サブシェルの外では使用できません。これらは子プロセスにローカルな変数です。

これを解決する 1 つの方法は、一時ファイルを使用して中間値を保存することです:

TEMPFILE=/tmp/$$.tmp
echo 0 > $TEMPFILE

# Loop goes here
  # Fetch the value and increase it
  COUNTER=$[$(cat $TEMPFILE) + 1]

  # Store the new value
  echo $COUNTER > $TEMPFILE

# Loop done, script done, delete the file
unlink $TEMPFILE

COUNTER=1
while [ Your != "done" ]
do
     echo " $COUNTER "
     COUNTER=$[$COUNTER +1]
done

テスト済みの BASH:Centos、SuSE、RH


COUNTER=$((COUNTER+1)) 

は、現代のプログラミングでは非常に扱いにくい構造です。

(( COUNTER++ ))

より「モダン」に見えます。

も使用できます
let COUNTER++

読みやすさが向上すると思われる場合。ときどき、Bash はあまりにも多くの方法を提供します (おそらく Perl の哲学だと思います) が、おそらく Python の「正しい方法は 1 つしかない」方が適切かもしれません。それがあったとしても、それは議論の余地のある声明です!とにかく、(この場合の)目的は、変数をインクリメントすることだけではなく、(一般的なルール)他の誰かが理解してサポートできるコードを書くことでもあることをお勧めします。適合性は、それを達成するための長い道のりです。

HTH


Linux
  1. Bashでビルド番号を増やしますか?

  2. Bash初心者シリーズ#8:Bashのループ

  3. Bash for ループの例

  1. jpsが機能しない

  2. Linux で fflush() が機能しない

  3. Linux コマンド 'll' が機能しない

  1. Curl Outfile変数がBashスクリプトで機能しませんか?

  2. R 3.5.0 Ubuntu 18.04で動作しませんか?

  3. Conda コマンドはコマンド プロンプトでは機能するが、bash スクリプトでは機能しない