我有这个:
function abash {
if [[ -v $1 ]]
then
atom ~/Shell/$1.sh
else
atom ~/.bashrc
fi
}
在我的~/.bashrc
文件中,以便更容易使用 Atom 编辑我的 bash 脚本,现在的问题是,这[[ -v $1 ]]
意味着要检查输入是否$1
存在,但它似乎不存在,即使我提供了有效的输入(例如,运行abash cd
where ~/Shell/cd.sh
is 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
}
答案是与此类似但请注意:
我包含的内容以使其正常工作。