如何检查变量是否已传递给 Bash 中的函数?

如何检查变量是否已传递给 Bash 中的函数?

我有这个:

function abash {
    if [[ -v $1 ]]
        then
            atom ~/Shell/$1.sh
        else
            atom ~/.bashrc
    fi
}

在我的~/.bashrc文件中,以便更容易使用 Atom 编辑我的 bash 脚本,现在的问题是,这[[ -v $1 ]]意味着要检查输入是否$1存在,但它似乎不存在,即使我提供了有效的输入(例如,运行abash cdwhere ~/Shell/cd.shis a file I要编辑) abash 将打开~/.bashrc.我该如何解决这个问题?我从哪里得到测试的想法[[ -v $1]]回答。

答案1

我不确定为什么会失败,但(至少)还有其他两个可能的选择。[[ -v $1 ]]您可以使用以下任一选项来代替。

检查参数数量是否大于零。

[[ $# > 0 ]]

检查第一个参数是否不为空。

[[ $1 != '' ]]

答案2

bash条件表达式-v var检查 if外壳变量命名var已设置。

当使用 时,您实际上检查了是否设置了[[ -v $1 ]]以内容命名的变量。$1在你的例子中,它意味着$cd,它从未被设置。

您可以简单地检查是否$1为非空字符串,使用-n

function abash {
    if [[ -n "$1" ]]
        then
            atom ~/Shell/"$1.sh"
        else
            atom ~/.bashrc
    fi
}

请注意,var必须是外壳变量为了-v var工作。[[ -v 1 ]]永远不会工作,因为1表示为位置参数

答案3

测试中需要的是姓名var 的,标签名称,如果你愿意的话。要测试变量 a,你可以这样做不是执行`[[ -v $a ]],你会:

[[ -v a ]]

然而,没有办法(据我所知)来测试位置参数,-v因为本质上,位置参数没有名称。或者,如果您愿意,它们是数字,并且该测试不适用于数字。

因此,您需要直接测试 var,而无需借助-v以下命令:

[[ ${1:+present} ]]

还:

你应该引用你的 var 扩展。
我更喜欢使用 $HOME,而不是波浪号。它允许带引号的字符串。

abash() {
    if [[ ${1:+present} ]]
        then
            atom "$HOME/Shell/$1.sh"
        else
            atom "$HOME/.bashrc"
    fi
}

答案是与此类似但请注意:我包含的内容以使其正常工作。

相关内容