我不明白为什么下面这个函数无论我是否传入第一个位置参数,测试 [[ ! -v 1 ]]
都会失败:
shopt -os nounset
function foo {
echo -n "$FUNCNAME: 1st positional parameter "
[[ ! -v 1 ]] && echo "is missing." || echo is "\"$1\"."
}
我知道还有其他测试方法,但为什么这个特定的测试不起作用呢?
我不明白为什么下面这个函数无论我是否传入第一个位置参数,测试 [[ ! -v 1 ]]
都会失败:
shopt -os nounset
function foo {
echo -n "$FUNCNAME: 1st positional parameter "
[[ ! -v 1 ]] && echo "is missing." || echo is "\"$1\"."
}
我知道还有其他测试方法,但为什么这个特定的测试不起作用呢?
has_1() {
if [[ -z "${1+present}" ]]; then
echo "no first param"
else
echo "given: $1"
fi
}
参数扩展 ${var+word}
仅在参数未设置时返回 "word" -- 即如果您传递一个空字符串,该函数将指示第一个参数已给出。
bash
在使用shopt -os nounset
时失败。如果没有其他人能够解释为什么[[ ! -v 1 ]]
不起作用,我将考虑这是一个错误。 - Tim Friskeset -- bar; echo $1; [[ -v 1 ]] || echo no foo
- glenn jackmanBash 5.1有一种非常简单的方法来实现这个功能。如在发布说明中所述:
x. `test -v N'现在可以测试位置参数N是否设置。
因此,要检查第N个参数是否已设置,可以使用以下任一方式:
test -v N
[ -v N ]
看一个非常基本的例子:
test -v 1 && echo "1st parameter is set: '$1'"
[ -v 2 ] && echo "2nd parameter is set: '$2'"
查看一些示例:
bash-5.1$ bash script.sh ""
1st parameter is set: ''
bash-5.1$ bash script.sh a b
1st parameter is set: 'a'
2nd parameter is set: 'b'
bash-5.1$ bash script.sh ""
1st parameter is set: ''
bash-5.1$ bash script.sh "" bla
1st parameter is set: ''
2nd parameter is set: 'bla'
if [ "$#" -gt "0" ]; then echo 'ok'; else echo '0'; fi
$#
只是间接地测试第一个位置参数是否设置。此外,在他的答案中,他无法解释为什么[[ ! -v 1 ]]
会失败。 - Tim Friske-v
选项在 test
中的含义。 - alinsoar以下模式涵盖了大多数实际应用场景:
[[ -z "${2:-}" ]] && echo "The 2'nd parameter is unset" >&2 && exit 1
[[ -v SHELL ]]; echo $?
命令。-z
无法使用,因为存在shopt -os nounset
配置。 - Tim Friske-v varname
如果shell变量varname已设置(已分配一个值),则为True。 - dogbane$#
。另请参见https://dev59.com/F2bWa4cB1Zd3GeqPTiJb - German Garcia