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中执行此操作,而无需借助字符串来构建整个命令?
这是${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)
你可以试试
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)
输出:无
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |