问题
我的bash脚本循环遍历一堆文件,如果它找到包含某些文本的意外文件,它会设置一个错误标志,并且应该退出循环。问题是当我在循环之后评估错误条件时,错误标志未正确设置。 我似乎无法看到错误的位置。
代码
#!/bin/sh
valid=1
grep -rs -L 'bogustext' * | while read line; do
echo "Processing file '$line'"
if [ "$line" != "arc/.keep" ] && [ "$line" != "arc/prp/lxc" ] && [ "$line" != "arc/lbb/lxc" ]; then
valid=0
echo "just set it to zero - $valid"
break 2
fi
done
echo "$valid"
if [ "$valid" -eq 0 ]; then
echo "1..1"
echo "not ok $line invis malformed"
else
echo "1..1"
echo "ok"
fi
这是显示问题/错误的输出。如您所见,列表中有一个包含伪造字符串“arc / ttp”的额外文件。该脚本将“有效”变量设置为0,但是当我准备好对其进行评估以显示正确的状态时,它仍然是原始值。
lab-1:/var/vrior# sh test.sh
Processing file 'arc/.keep'
Processing file 'arc/prp/lxc'
Processing file 'arc/lbb/lxc'
Processing file 'arc/ttp'
just set it to zero - 0
1
1..1
ok
到目前为止我尝试了什么 我目前正在谷歌上搜索Bash中是否存在局部变量与全局变量。不太确定,但如果你看到我的错误,请告诉我。
答案 0 :(得分:2)
管道创建子壳,因此循环内的$valid
引用一个新变量,在您尝试使用它之前它会消失。
由于您已标记了bash,因此您可以使用进程替换而不是管道:
while read line; do
echo "Processing file '$line'"
if [ "$line" != "arc/.keep" ] && [ "$line" != "arc/prp/lxc" ] && [ "$line" != "arc/lbb/lxc" ]; then
valid=0
echo "just set it to zero - $valid"
break 2
fi
done < <(grep -rs -L 'bogustext' *)