ループで動作するbash算術。 varはループ後に値を持ちません。

ループで動作するbash算術。 varはループ後に値を持ちません。

ループの繰り返し数を計算するために整数を使用しようとしていますが、ループが完了した後に変数は空です。手がかりを見つけましたが、運はありません。

私はこのコードを持っています:

#!/bin/bash

declare -i count

echo entering loop

while read var
do
  (( count++ ))
  echo $count
done

echo exited loop
echo count is $count

インタラクティブに実行した場合、「c」と入力してCtrl + Dを押すと、次の結果が表示されます。

$ ./example
entering loop
a
1
b
2
c
3
exited loop
count is 3

しかし、ループに入力を供給すると、次のようになります。

#!/bin/bash

declare -i count

echo entering loop

ls -la | while read var
do
  (( count++ ))
  # do something interesting here
  echo $count
done

echo exited loop
echo count is $count

...この結果は次のとおりです。

$ ./example
entering loop
1
2
3
4
5
exited loop
count is
$

ループを終了した後に「count is 5」が表示されないのはなぜですか?

ベストアンサー1

whileループに値をパイプすると、パイプのコマンドがサブシェルで実行され、whileループが終了するとカウンタ変数の値が失われます。

以下を使用してこの問題を解決できます。プロセスの交換パイプの代わりに:

#!/bin/bash

declare -i count
while read var
do
  ((count++))
  echo "$count"
done < <(ls -la)
echo "count is $count"

あるいは、現在のシェルコンテキストでパイプラインの最後のコマンドを実行するlastpipe機能を有効にすることもできます。bash

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

lastpipe
設定されていてジョブ制御が有効になっていない場合、シェルはバックグラウンドで実行されていない現在のシェル環境でパイプラインの最後のコマンドを実行します。

#!/bin/bash

declare -i count
shopt -s lastpipe # enable lastpipe
ls -la | while read var
do
  ((count++))
  echo "$count"
done
shopt -u lastpipe # disable lastpipe
echo "count is $count"

関連:

おすすめ記事