whileループでグローバル変数を変更する

whileループでグローバル変数を変更する

フォルダを処理し、同時にファイル数を数えるスクリプトがあります。

i=1
find tmp -type f | while read x
do 
   i=$(($i + 1))
   echo $i
done
echo $i

ところで$iいつもそうですね1。どうやって解決しますか?

ベストアンサー1

あなたの例では、whileループはサブシェルで実行されるため、whileループ内の変数の変更は外部変数には影響しません。これはパイプ付きループを使用しているため、自動的にサブシェルで実行されます。

以下は、whileループを使用する代替ソリューションです。

i=1
while read x; do
   i=$(($i + 1))
   echo $i
done <<<$(find tmp -type f)
echo $i

forループを使用する同じアプローチは次のとおりです。

i=1
for x in $(find tmp -type f);
do 
   i=$(($i + 1))
   echo $i
done
echo $i

詳しくは、次の投稿をご覧ください。

高度なBashスクリプトガイドの次の章も参照してください。

おすすめ記事