2017-08-31 52 views
0

问题庆典 - 设置变量值不工作

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

此外,[BashFAQ/024](http://mywiki.wooledge.org/BashFAQ/024 ):“我在一个管道中的循环中设置变量,为什么在循环终止后它们消失了?或者,为什么我不能通过管道数据读取?” –

+0

谢谢@BenjaminW。问题是我是一个shell编程的noob,所以我甚至不知道要搜索什么。甚至不知道“|”被称为管道。但现在我知道了!感谢您的链接 – dot

回答

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' *) 
+0

谢谢汤姆。我正在尝试这个尝试,但你认为有“<<”?有一个空间嵌入?因为我得到了关于“意外的重定向”在这条线上的错误 – dot

+0

@dot你应该确保你使用bash。在脚本的顶部使用'#!/ bin/bash'。如果你需要用另一个shell来完成,可以通过其他方法来实现。 –