Shell - 可变范围和分配

时间:2014-02-02 04:10:02

标签: shell variables unix scope variable-assignment

我很好奇为什么变量“nameExists”的赋值在以下代码中无法正常工作:

        nameExists=1
        cat $dataFile | while read line
        do
            lineName=${line%%:*}
            if [ "$lineName" == "$name" ]
            then
                echo "The entry you are trying to add already exists!"
                nameExists=0
                break
            fi
        done

        if [ $nameExists -eq 1 ]
        then
            echo "Append here."
        fi

我发现,无论我是否达到内部赋值“nameExists = 0”,$ nameExists的值始终为1.我想知道这是否因为do循环中的nameExists变量被认为是本地的变量。如果是这样,我将如何声明nameExists变量或分配给nameExists变量,使得值0在分配后仍然存在。

1 个答案:

答案 0 :(得分:0)

我的问题的答案相对简单,并从这里的文章中收集:http://mywiki.wooledge.org/BashFAQ/024

通过管道命令引入新的SubShell,

cat $dataFile | 

我随后介绍了一个特定于Subshel​​l的新变量上下文和环境。因此,我的赋值“nameExists = 0”在循环内局部限定,并且一旦Subshel​​l完成执行就不会持久化。我通过删除不必要的管道解决了这个问题。我生成的代码按预期工作,如下所示。

    nameExists=1
    while read -r line
    do
          lineName=${line%%:*}
          if [ "$lineName" == "$name" ]
          then
              echo "The entry you are trying to add already exists!"
              nameExists=0
              break
          fi
    done < $dataFile

    if [ $nameExists -eq 1 ]
    then
        echo "Append here."
    fi