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

时间:2015-12-07 22:39:43

标签: bash command-line-arguments

我有一个很长的命令,我想在某种情况下修改为包括一个选项。

E.g。

java -jar compiler.jar --externs "$externs"
    --foo "another" --bar "more"

如果--externs "$externs"为空,我希望$externs完全省略。有没有办法在bash中执行此操作而不需要使用字符串构建整个命令?

2 个答案:

答案 0 :(得分:5)

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

java ... ${externs:+--externs "$externs"}

这也是使用数组的常用习惯用法:

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

java ... "${args[@]}"

答案 1 :(得分:4)

你可以尝试

java -jar compiler.jar ${externs:+--externs} "${externs:-}"  --foo "another" --bar "more"

解释,来自bash docs

  

${parameter:-word}

     

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

     

${parameter:+word}

     

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

你可以自己尝试:

externs="some value"
printf '%s\n' ${externs:+--externs} "${externs:-}"

输出

  

- 实习医生
  一些价值

注意:我在printf处使用$externs来测试包含多个单词的externs= echo ${externs:+--externs} "${externs:-}" 的情况,如果在变量展开后引用没有被应用,则输出看起来像

  

- 实习医生
  一些
  值

所以我认为这应该足够了。

{{1}}

输出:nil