变量未在shell脚本中重新分配

时间:2013-12-03 16:54:36

标签: bash shell unix terminal

我在重新分配POSTCODE_VALID变量时遇到问题。当满足if条件时,它不会被重新分配。我确保满足if条件并且应该将其设置为true。但事实并非如此。有谁知道为什么?

POSTCODE_VALID=false
find codepoint/ | while read i ;
do

    if [[ $i =~ codepoint/$AREACODE ]]
            then
                    #This is the variable that doesn't get re-assigned.
                     POSTCODE_VALID=true
    fi
done

3 个答案:

答案 0 :(得分:6)

管道创建子壳; POSTCODE_VALID的赋值对于该shell是本地的,因此不会影响父级中的POSTCODE_VALID

更简单的解决方案是检查codepoint/$AREACODE是否存在。

if [[ -f codepoint/$AREACODE ]]; then
    POSTCODE_VALID=true
else
    POSTCODE_VALID=false
fi

如果您确实需要进行更一般的匹配,请使用for循环并在匹配后立即中断:

POSTCODE_VALID=false
for f in "codepoint/$AREACODE"*; do
    if [[ -f $f ]]; then
        POSTCODE_VALID=true
        break
    fi
done

(基本上,这个循环最多只执行一次;如果没有匹配,则会按字面意思处理glob,当然,它不会是现有文件的名称。)

答案 1 :(得分:1)

问题是你的管道,它(在bash中,而不是ksh)创建一个子shell。使用管道的替代方法是使用进程替换

POSTCODE_VALID=false
while read i 
do
    if [[ $i =~ codepoint/$AREACODE ]]
    then
        POSTCODE_VALID=true
        break
    fi
done < <(find codepoint/)

我添加了break,因为一旦设置了变量,再次设置就没有意义了。

虽然我喜欢@ chepner的解决方案,以避免findread

答案 2 :(得分:0)

另一个(快速和肮脏)解决方案是使用您自己的代码,但如果找到您的isacode而不是使用变量,则使用“touch”创建临时文件 - 有点难看,但可行。这将允许测试更复杂的目录结构。

当然,您必须在开始之前删除临时文件:

rm /tmp/AreacodeFound 2> /dev/null