0

我不明白为什么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"
}
4

2 回答 2

2

您正在使用管道,它在子外壳中启动 while .. do 。更改子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"
}

(这也摆脱了 Cat 的无用使用)

于 2012-11-26T13:35:20.797 回答
2

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

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.
于 2012-11-26T13:40:04.903 回答