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

因为您使用了管道 ( |) 并且管道周围的命令在子 shell 中运行。

因此,变量的值var在相关子 shell 中更改(递增),并在子 shell 退出时超出范围,因此不会对父 shell 的值产生影响,因此父 shell 的值仍为 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

相关内容