有条件地省略bash中的命令行选项

Chr*_*ton 3 bash command-line-arguments

我有一个长命令,在某些情况下需要修改以包括或不包括一个选项。

例如

java -jar compiler.jar --externs "$externs"
    --foo "another" --bar "more"
Run Code Online (Sandbox Code Playgroud)

--externs "$externs"如果$externs要清空,我希望将其完全省略。有什么方法可以在bash中执行此操作,而无需借助字符串来构建整个命令?

Cha*_*ffy 5

这是${key:+WORDS}扩展的目的:

java ... ${externs:+--externs "$externs"}
Run Code Online (Sandbox Code Playgroud)

将数组用于此目的也是一种常见的习惯用法:

args=( )
if [[ $externs ]]; then
  args+=( --externs "$externs" )
fi

java ... "${args[@]}"
Run Code Online (Sandbox Code Playgroud)


the*_*fog 5

你可以试试

java -jar compiler.jar ${externs:+--externs} "${externs:-}"  --foo "another" --bar "more"
Run Code Online (Sandbox Code Playgroud)

解释,来自 bash 文档

${parameter:-word}

使用默认值。如果参数未设置或为空,则替换单词的扩展。否则,替换参数的值。

${parameter:+word}

使用替代值。如果参数为空或未设置,则不替换任何内容,否则替换单词的扩展。

你可以自己试试:

externs="some value"
printf '%s\n' ${externs:+--externs} "${externs:-}"
Run Code Online (Sandbox Code Playgroud)

输出

--externs
一些值

注意:我printf在这里测试了$externs包含多个单词的情况,如果在变量扩展后没有应用引用,输出看起来像

--externs
一些

所以我相信这应该足够了。

externs=
echo ${externs:+--externs} "${externs:-}"
Run Code Online (Sandbox Code Playgroud)

输出:无