我有一个功能:
something() {
if [ something ]; then
echo "Something.";
return 0;
else
echo "Not something.";
return 1;
fi
}
我在一个循环中调用它,它实际上验证了一些文件并计算有效文件的数量:
find . -type l | while read line ; do something "$line"; done
我需要计算有多少文件无效,因此函数返回的次数为0
。我在想这个:
INVALID=0;
find . -type l | while read line ; do INVALID=$(($INVALID + something "$line")); done
毋庸置疑,bash并不买。请注意以下几点:
something
中的信息必须打印在stdout
。答案 0 :(得分:4)
返回值不能直接用于算术运算。您可以调用该函数然后访问$?
,或者根据函数的结果进行分支,如下所示:
INVALID=0
while IFS= read -r line; do
something "$line" || ((++INVALID))
done < <(find . -type l)
另请注意,您无法更改管道内的变量。管道在子壳中运行并具有自己的变量副本。您需要重新构建循环,以便在没有管道的情况下运行,以便对$INVALID
进行更改:将find | loop
更改为loop < <(find)
。
使用read -r
禁用反斜杠转义并清除$IFS
以更好地处理具有前导空格的行也是一个好主意。