bash - 设置变量值不起作用

时间:2017-08-31 14:03:04

标签: bash

问题

我的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中是否存在局部变量与全局变量。不太确定,但如果你看到我的错误,请告诉我。

1 个答案:

答案 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' *)