bash shell 脚本中参数位置旁边的连字符有什么作用?喜欢 ${1-}

xtr*_*ing 9 shell bash shell-script arguments

我从这里遇到了这段代码:

#!/bin/bash

# ...

if [[ "${1-}" =~ ^-*h(elp)?$ ]]; then
    echo "Usage..."
    exit
fi
Run Code Online (Sandbox Code Playgroud)

我知道它的作用是在传递任何参数(如-h, --help, -help, )时打印使用信息。-------help

但为什么"${1-}"而不仅仅是"${1}"?连字符有什么作用?

起初我认为这可能意味着从位置 1 开始的任何论证。我试过了,不,不是那样的。

然后我认为这可能是一个错字,作者的意思"${1-9}"是允许所有数字位置。再说一次,它不起作用,它甚至不是有效的代码。

Ste*_*itt 22

参数扩展中的连字符允许指定默认值。因此${1-}表示 \xe2\x80\x9c 第一个参数的值(如果已设置),否则表示空字符串 \xe2\x80\x9d。

\n

这看起来并不特别有用,因为未设置的变量无论如何都会扩展到空字符串。然而,如果启用并且没有给出参数,${1}将会导致错误,而won\xe2\x80\x99t \xe2\x80\x94 因此一些 shell 程序员在引用可能合法未设置的变量时总是使用这种形式。set -u${1-}

\n

在您找到此内容的网站的上下文中,这与 \xe2\x80\x9cthing\xe2\x80\x9d 数字 5 相符:

\n
\n
    \n
  1. 更喜欢使用set -o nounset. 您可能有很好的借口不这样做,但是,我认为,\xe2\x80\x99 最好始终设置它。

    \n
      \n
    • 当访问未设置的变量时,这将使脚本失败。避免因变量名称中的拼写错误而产生可怕的意外后果。
    • \n
    • 当您想要访问可能已设置或未设置的变量时,请使用,"${VARNAME-}"而不是"$VARNAME", 那么\xe2\x80\x99 就很好了。
    • \n
    \n
  2. \n
\n
\n

  • 在这种情况下则不然。如果“a”未设置或为空,则“${a:-b}”将扩展为“b”;如果“a”未设置,则“${ab}”将扩展为“b”。由于 `${1-}` 中默认为空,因此 `${1-}` 和 `${1:-}` 具有相同的效果。 (5认同)