私のコード
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