为什么这个Bash脚本没有改变字符串的值?

时间:2012-11-26 10:50:50

标签: bash shell terminal

我无法理解为什么 userType 没有改变。

我确定它已成功达到 determineType ,但在我稍后尝试打印 userType 时,它并未将值更改为“bbb”。

userType="aaa"

function determineType {
    userType="bbb"
}

function checkUser {
    cat users.csv | \
    while read userLine; do
        if [[ $userLine =~ .*$user.* ]]
            then
            determineType
            echo "1"
        fi
    done
    echo "0"
}

2 个答案:

答案 0 :(得分:2)

你正在使用一个管道,它启动while ..在子shell中执行。 更改子shell中变量的值不会影响原始变量

你应该替换:

function checkUser {
    cat users.csv | \
    while read userLine; do
        if [[ $userLine =~ .*$user.* ]]
            then
            determineType
            echo "1"
        fi
    done
    echo "0"
}

function checkUser {
    while read userLine; do
        if [[ $userLine =~ .*$user.* ]]
            then
            determineType
            echo "1"
        fi
    done < users.csv
    echo "0"
}

(这也消除了无用的猫)

答案 1 :(得分:2)

正如soulseekah在评论中所说,你的while循环在子shell中执行。相反,做(并且,作为一种好处,你摆脱了无用的猫):

userType="aaa"

determineType() {
    userType="bbb"
}

checkUser() {
    while read userLine; do
        if [[ $userLine = *$user* ]]; then
            determineType
            return 1
        fi
    done < users.csv
    return 0
}

注意。我也改变了一些事情:

  • 摆脱了无用的正则表达式,因为使用globbing可以实现同样的目的,
  • 使用了更常用的方法来定义bash中的函数,
  • 使用return代替echo来返回值:您使用echo再次遇到同样的问题:您可能会在另一个子shell中使用您的函数checkUser来获取echo返回的值。