我有一个很长的命令,我想在某种情况下修改它以包括一个选项或不包括该选项。
例如:
java -jar compiler.jar --externs "$externs"
--foo "another" --bar "more"
如果$externs
为空,我希望完全省略--externs "$externs"
。在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[@]}"
+
前面缺少了一个 :
。 - Chris Middleton+
之前加上:
取决于您如何处理空值,而不是未设置的值;如果您想将存在但为空的变量视为未设置,则应该使用:+
。 - Charles Duffy你可以尝试
java -jar compiler.jar ${externs:+--externs} "${externs:-}" --foo "another" --bar "more"
说明,来自bash文档
${parameter:-word}
使用默认值。如果参数未设置或为空,则替换为单词的扩展。否则,替换为参数的值。
${parameter:+word}
使用备用值。如果参数为空或未设置,则不进行替换,否则替换为单词的扩展。
您可以尝试以下操作:
externs="some value"
printf '%s\n' ${externs:+--externs} "${externs:-}"
输出
--externs
一些值
注意:我在这里使用printf
测试了$externs
包含多个单词的情况,如果在变量扩展后没有应用引号,输出将如下所示:
--externs
一些
值
因此,我认为这应该足够了。
externs=
echo ${externs:+--externs} "${externs:-}"
输出: 空值
>
主要用于引用文本;这里可能有不同的含义。 - Charles Duffy:-
的方法。我选择了 Charles 的答案,因为它是第一个并且也提供了数组解决方案,但这里还有一些很棒的东西。通过一些实验,我发现如果 foo=
,那么 ${foo:-}
将是省略的参数,而 ${foo:-""}
将是空字符串。很酷。 - Chris Middleton>
格式只是为了在代码和输出之间进行视觉区分。当然,如果你的代码是可移植的,那就更好了。 - the_velour_fog
externs='two words'; if [ ! -z "$externs" ]; then externs_option="--externs \"$externs\""; fi; printf '%q\n' java -jar compiler.jar $externs_option --foo "two words" --bar "etc"
的输出,并比较传递给--externs
和传递给--foo
的two words
。 - Charles Duffy