为什么这个 Bash 脚本不更改字符串的值?



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

正如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
}

注意。我还更改了一些内容:

  • 摆脱了无用的正则表达式,因为可以通过通配实现相同的效果,
  • 使用更常见的方法来定义 bash 中的函数,
  • 用于return而不是echo返回值:你会再次遇到同样的问题,echo:你可能会在另一个子shell中使用你的函数checkUser来获取echo返回的值。

您正在使用一个管道,它在子外壳中启动 while .. do。更改子外壳中变量的值不会影响原始变量

您应该替换:

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"
}

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

相关内容

  • 没有找到相关文章

最新更新