我想知道为什么测试[[ ! -v 1 ]]
无论是否将第一个位置参数传递给下面的函数都会失败:
shopt -os nounset
function foo {
echo -n "$FUNCNAME: 1st positional parameter "
[[ ! -v 1 ]] && echo "is missing." || echo is "\"$1\"."
}
我知道还有其他方法可以测试,但为什么这个特定的测试不起作用?
答案 0 :(得分:3)
在这种情况下,您要检查参数是否未设置。
has_1() {
if [[ -z "${1+present}" ]]; then
echo "no first param"
else
echo "given: $1"
fi
}
仅当参数未设置时,parameter expansion ${var+word}
才会返回“word” - 即如果传递空字符串,则该函数将指示第一个参数给出了。
答案 1 :(得分:3)
if [ "$#" -gt "0" ]; then echo 'ok'; else echo '0'; fi
答案 2 :(得分:0)
Bash 5.1具有非常简单的方法。如release notes中所述:
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'
答案 3 :(得分:0)
以下模式涵盖了大部分实际用例:
[[ -z "${2:-}" ]] && echo "The 2'nd parameter is unset" >&2 && exit 1