用于反向“使用替代值”的便捷 shell 惯用语

pil*_*row 5 shell posix sh

我正在寻找一种快速的 POSIX shell 习惯用法,它可以执行“使用替代值”参数扩展逆操作${VARIABLE:+word}

也就是说,当 VARIABLE 为 null 或未设置时,我想要word,但是当 VARIABLE 不为 null 时,我想要 null 。

例如,如果我有一个 shell 变量 FLAG_VERBOSE,当该变量为非空时,我可以轻松地使通常安静的命令变得更加详细:

some_quiet_cmd ${FLAG_VERBOSE:+ --verbose} arg arg arg ... # verbose only if $FLAG_VERBOSE is set
Run Code Online (Sandbox Code Playgroud)

但是,当我有一个通常喋喋不休的命令时,当未通过提供参数设置 FLAG_VERBOSE 时,我想抑制其通常的喋喋不休:

if [ "$FLAG_VERBOSE" ]; then
  CHATTINESS=
else
  CHATTINESS=--quiet
fi

some_chatty_cmd $CHATTINESS arg arg arg ... # --quiet unless $FLAG_VERBOSE is set
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以用一个紧凑的表达式来做到这一点?我觉得好像缺少一个假设的参数扩展运算符${VARIABLE:!word}或类似的运算符。(也许我们会称之为“使用互补价值”?)

pil*_*row 1

这是我能想到的最方便的形式:

some_chatty_cmd $( [ "$FLAG_VERBOSE" ] || echo --quiet ) arg... # default --quiet
#               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)