庆典 - 设置变量值不工作
我的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中有局部变量与全局。不太确定,但如果你看到我的错误,请告诉我。
管道创建子壳体,因此循环内的$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' *)
谢谢汤姆。我正在尝试这个尝试,但你认为有“ dot
@dot你应该确保你使用bash。在脚本的顶部使用'#!/ bin/bash'。如果你需要用另一个shell来完成,可以通过其他方法来实现。 –
此外,[BashFAQ/024](http://mywiki.wooledge.org/BashFAQ/024 ):“我在一个管道中的循环中设置变量,为什么在循环终止后它们消失了?或者,为什么我不能通过管道数据读取?” –
谢谢@BenjaminW。问题是我是一个shell编程的noob,所以我甚至不知道要搜索什么。甚至不知道“|”被称为管道。但现在我知道了!感谢您的链接 – dot