函数内的参数替换

时间:2017-11-26 11:15:16

标签: bash shell

当用户点击read

时,我需要设置默认值(y)
validate() {
    local validated=false
    while [ "$validated" != "true" ]; do
            read -p "$1 " $2
            $2=${2:-y}
            if [[ "$2" == "y" || "$2" == "n" ]]; then
                    validated=true
            fi
    done
}

当我使用validate "text" test运行此功能并使用enter跳过read时,会显示错误test=test: command not found。 如何使用函数参数替换?

2 个答案:

答案 0 :(得分:2)

要使用动态名称为变量写入值,可以使用printf -v "$name" "$value"。 这应该更接近你想要的, 虽然我怀疑还有一些混乱和后续问题:

validate() {
    local message=$1
    local out=$2
    local validated=false answer

    while [ "$validated" != true ]; do
        read -p "$message " answer
        answer=${answer:-y}
        if [[ "$answer" == "y" || "$answer" == "n" ]]; then
            validated=true
        fi
    done

    printf -v "$out" "$answer"
}

答案 1 :(得分:1)

有几个问题,但您可以通过语句

看到最简单的问题
$2=${2:-y}

假设用户将字符串FOO作为第二个参数传递。该声明变为

FOO=FOO

当然不是你所期望的。现在假设没有传递第二个参数。在这种情况下,$2计算为空字符串,$2=${2:-y}计算为 y 。因此,该陈述变为

=y

甚至语法不正确。考虑到这一点,你可以看到你的

read -p "$1 " $2

也没有意义。

编写函数时,最好的方法是不在算法本身中使用位置参数(除非你有充分的理由这样做),而是将它们分配给变量并使用变量,如@janos在他的建议中所证明的那样解。它不仅更安全,而且使您的程序更容易理解。