フォルダを処理し、同時にファイル数を数えるスクリプトがあります。
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スクリプトガイドの次の章も参照してください。
答え2
i=1
while read x
do
i=$(($i + 1))
echo $i
done < <(find tmp -type f)
echo $i
https://stackoverflow.com/questions/7390497/bash-propagate-value-of-variable-to-outside-of-the-loop