4

我想知道为什么[[ ! -v 1 ]]无论我是否将第一个位置参数传递给下面的函数,测试都会失败:

shopt -os nounset

function foo {
  echo -n "$FUNCNAME: 1st positional parameter "
  [[ ! -v 1 ]] && echo "is missing." || echo is "\"$1\"."
}

我知道还有其他测试方法,但为什么这个特定的测试不起作用?

4

4 回答 4

4

在这种情况下,您要检查参数是否未设置。

has_1() {
  if [[ -z "${1+present}" ]]; then 
    echo "no first param"
  else
    echo "given: $1"
  fi
}

仅当参数未设置时,参数扩展 ${var+word}才会返回“word” ——即,如果您传递一个空字符串,该函数将指示第一个参数已给出。

于 2012-11-13T17:04:29.903 回答
3
if [ "$#" -gt "0" ]; then echo 'ok'; else echo '0'; fi
于 2012-11-13T17:43:34.647 回答
3

Bash 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'
于 2020-12-10T10:50:20.510 回答
0

以下模式涵盖了大多数实际用例:

[[ -z "${2:-}" ]] && echo "The 2'nd parameter is unset" >&2 && exit 1

壳参数扩展

于 2021-01-12T13:08:32.483 回答