find & while [繰り返し]の後、変数は変更されません。

find & while [繰り返し]の後、変数は変更されません。

私のコード

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

関連情報