【问题标题】:Conditionally omit a command line option in bash有条件地省略 bash 中的命令行选项
【发布时间】:2016-03-12 17:04:41
【问题描述】:

我有一个很长的命令,我想在某种情况下修改它以包含或不包含选项。

例如

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

如果$externs 为空,我希望完全省略--externs "$externs"。有没有办法在 bash 中做到这一点,而无需使用字符串构建整个命令?

【问题讨论】:

  • 我认为这是在脚本的上下文中?
  • 是的,它在一个更大的脚本中。我试图避免的另一种可能性是简单地在两个 if 分支中重复该命令。如果有一些不同的命令需要省略,那会变得很麻烦。我在想可能有一些字符串替换命令导致 bash 甚至没有插入参数。但我还没有找到它,如果它存在的话。
  • 顺便说一下,这是 BashFAQ #50 的子问题 3:mywiki.wooledge.org/BashFAQ/…
  • @miken32,在我回答您的澄清请求之前,您删除了您的答案。检查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 一起传递的two words 和与--foo 一起传递的--foo

标签: bash command-line-arguments


【解决方案1】:

这就是 ${key:+WORDS} 扩展的用途:

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

使用数组来达到目的也是一种常见的习惯用法:

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

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

【讨论】:

  • 这个答案写得很好,我也喜欢你的数组方法。我认为您在+ 之前缺少:
  • @ChrisMiddleton,在+ 之前是否需要: 取决于您要如何处理空值,而不是未设置值;如果您想将存在但为空的变量视为未设置,那么是的,它将是:+
  • @ChrisMiddleton,...重新阅读您的问题,您确实明确地说“空”;适当编辑。
  • 使用谷歌的闭包编译器,我必须为每个外部文件提供一个单独的“--externs”选项,所以你的数组方法对我来说非常有用。
【解决方案2】:

你可以试试

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

解释,来自 bash 文档

${parameter:-word}

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

${parameter:+word}

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

你可以自己试试:

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

输出

--外部
一些价值

注意:我在这里使用printf 测试$externs 包含多个单词的情况,如果在变量扩展后没有应用引用,输出将如下所示

--外部
一些
价值

所以我相信这就足够了。

externs=
echo ${externs:+--externs} "${externs:-}"

输出:无

【讨论】:

  • 从正确性的角度来看,我没有什么要补充的——这是一个很好的答案(而且比我的更偏执于遵守 POSIX sh 规范,它依赖于 bash 实现的行为但是没有很好地记录)。这就是说 - 格式是怎么回事? >主要用于表示引用文字;想必这里有不同的意思。
  • 感谢您的回答。我特别喜欢使用:-。我选择 Charles 只是因为它是第一个并且也有阵列解决方案,但这里有一些整洁的东西。通过一些实验,我看到如果foo=,那么${foo:-} 将是一个省略参数,而${foo:-""} 将是空字符串。酷。
  • cool ,> 格式只是有助于在视觉上区分代码和输出。当然,如果您的代码是可移植的,它总是很有帮助
猜你喜欢
  • 2016-09-22
  • 2018-07-21
  • 2019-10-11
  • 2010-09-20
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多