【问题标题】:How can I test whether a positional parameter is set in Bash?如何测试是否在 Bash 中设置了位置参数?
【发布时间】:2021-01-12 21:08:32
【问题描述】:

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

shopt -os nounset

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

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

【问题讨论】:

  • AFAIK,-v 不是 [[ 可用的运算符(至少根据我系统上 bash 4.1 附带的手册页)。也许你想要[[ -z "$1" ]]?或者你真的需要测试零长度位置参数的存在吗?
  • 试试[[ -v SHELL ]]; echo $?-z 在这里不起作用,因为 shopt -os nounset
  • 可能它不适用于整数,使用像“foo”这样的普通变量名可以。
  • 我认为位置参数不符合 shell 变量,这就是为什么 -v 对它们不起作用
  • 对我来说,检查参数是否存在应该使用$#。另见stackoverflow.com/questions/11492338/…

标签: bash shell parameters


【解决方案1】:

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

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

parameter expansion${var+word} 只有在参数未设置时才会返回“word”——即,如果您传递一个空字符串,该函数将指示给定第一个参数。

【讨论】:

  • 您的提议听起来很合理,因为它通过符号引用位置参数并避免bashshopt -os nounset 而失败。如果没有其他人可以解释为什么 [[ ! -v 1 ]] 不起作用,我会将其视为 错误
  • 显然,-v 不适用于位置参数:set -- bar; echo $1; [[ -v 1 ]] || echo no foo
  • 从 Bash 5.1 开始,它确实有效:stackoverflow.com/a/65233119/1983854(请随意复制到您的答案中)
【解决方案2】:
if [ "$#" -gt "0" ]; then echo 'ok'; else echo '0'; fi

【讨论】:

  • 我们已经有了这个答案,但被作者删除了,因为$# 只是间接测试是否设置了第一个位置参数。同样在他的回答中,他无法解释为什么[[ ! -v 1 ]] 失败了。
  • 我也不知道-vtest 的选项是什么意思。
【解决方案3】:

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'

【讨论】:

    【解决方案4】:

    以下模式涵盖了大部分实际用例:

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

    Shell-Parameter-Expansion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2017-05-04
      相关资源
      最近更新 更多