我的代码
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