我有一个很长的命令,我想在某种情况下修改为包括一个选项。
E.g。
java -jar compiler.jar --externs "$externs"
--foo "another" --bar "more"
如果--externs "$externs"
为空,我希望$externs
完全省略。有没有办法在bash中执行此操作而不需要使用字符串构建整个命令?
答案 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