ループの繰り返し数を計算するために整数を使用しようとしていますが、ループが完了した後に変数は空です。手がかりを見つけましたが、運はありません。
私はこのコードを持っています:
#!/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"
関連: