![find & while [繰り返し]の後、変数は変更されません。](https://linux33.com/image/86901/find%20%26amp%3B%20while%20%5B%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%5D%E3%81%AE%E5%BE%8C%E3%80%81%E5%A4%89%E6%95%B0%E3%81%AF%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
私のコード
var=34
find $1 -type f | while read line;
do
file_status=`file "$line"`
file_name=`echo $line | sed s/".*\/"//g`
line_length=${#file_name}
if [ $line_length -gt $n ]; then
echo "hi there"
var=$((var+1))
fi
done
echo $var
hiメッセージは何度も表示されますが、whileループを完了した後、私の変数は34になります。
答え1
これはパイプ(|
)を使用し、パイプの周りのコマンドがサブシェルで実行されるためです。
したがって、対応するサブシェル内の変数の値がvar
変更(増加)され、サブシェルが終了すると範囲外になるため、親シェルの値には影響しないため、親シェルの値は34に維持されます。
この問題を解決するには、プロセス置換を使用して以下を実行できますfind
。
var=34
while read line; do
file_status=`file "$line"`
file_name=`echo $line | sed s/".*\/"//g`
line_length=${#file_name}
if [ $line_length -gt $n ]; then
echo "hi there"
var=$((var+1))
fi
done < <(find $1 -type f)
echo $var