有条件地省略 bash 中的命令行选项
Conditionally omit a command line option in bash
我有一个很长的命令,我想在特定情况下修改它以包含或不包含选项。
例如
java -jar compiler.jar --externs "$externs"
--foo "another" --bar "more"
如果 $externs
为空,我希望完全省略 --externs "$externs"
。在 bash 中有什么方法可以做到这一点,而无需使用字符串构建整个命令?
这就是 ${key:+WORDS}
扩展的用途:
java ... ${externs:+--externs "$externs"}
为了这个目的使用数组也是一个常见的习语:
args=( )
if [[ $externs ]]; then
args+=( --externs "$externs" )
fi
java ... "${args[@]}"
你可以试试
java -jar compiler.jar ${externs:+--externs} "${externs:-}" --foo "another" --bar "more"
解释,来自 bash 文档
${parameter:-word}
Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.
您可以自己尝试:
externs="some value"
printf '%s\n' ${externs:+--externs} "${externs:-}"
输出
--externs
some value
注意:我在这里使用 printf
测试 $externs
包含多个单词的情况,如果在变量扩展后未应用引号,输出将类似于
--externs
some
value
所以我认为这就足够了。
externs=
echo ${externs:+--externs} "${externs:-}"
输出:无
我有一个很长的命令,我想在特定情况下修改它以包含或不包含选项。
例如
java -jar compiler.jar --externs "$externs"
--foo "another" --bar "more"
如果 $externs
为空,我希望完全省略 --externs "$externs"
。在 bash 中有什么方法可以做到这一点,而无需使用字符串构建整个命令?
这就是 ${key:+WORDS}
扩展的用途:
java ... ${externs:+--externs "$externs"}
为了这个目的使用数组也是一个常见的习语:
args=( )
if [[ $externs ]]; then
args+=( --externs "$externs" )
fi
java ... "${args[@]}"
你可以试试
java -jar compiler.jar ${externs:+--externs} "${externs:-}" --foo "another" --bar "more"
解释,来自 bash 文档
${parameter:-word}
Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.
您可以自己尝试:
externs="some value"
printf '%s\n' ${externs:+--externs} "${externs:-}"
输出
--externs
some value
注意:我在这里使用 printf
测试 $externs
包含多个单词的情况,如果在变量扩展后未应用引号,输出将类似于
--externs
some
value
所以我认为这就足够了。
externs=
echo ${externs:+--externs} "${externs:-}"
输出:无