Bash 中执行行内的加载条件

Bash 中执行行内的加载条件

我想执行一个命令,该命令带有一个取决于变量属性的选项。如果设置了变量,则使用值加载该选项,但如果没有,则不加载该选项。这就是我所拥有的:

if [ -n "$variable" ]
  then command ... -option $variable
  else command ...
fi

我的想法是将其与其中的条件合并为一个命令,这样我就不必重复该命令的其他选项两次。

非常感谢您的宝贵时间。

答案1

使用 bash 数组:

opts=()
[ "$variable" ] && opts+=(-option "$variable")
command ... "${opts[@]}"

因为这使用了 bash 数组,所以即使$variable包含空格或其他困难字符,它也能起作用。

怎么运行的

  • opts=()

    这将创建一个名为 的空数组opts

  • [ "$variable" ] && opts+=(-option "$variable")

    如果$variable不为空,则我们将-option和附加$variable到数组opts

  • command ... "${opts[@]}"

    这将执行您的命令。如果opts非空,则将其元素添加到命令中。如果opts为空,则不添加任何内容:就像"${opts[@]}"根本没有一样。

答案2

然后接受你的命令并使其成为如下函数:

function command_function () {
  command ... -option $variable
}

if [ -n "$variable" ]
  then command_function ... -option $variable
  else command_function ...
fi

您要知道,Bash 函数中的括号不会传递任何内容。

答案3

使用猛击代换 (Shell 参数扩展)以获得简洁且易读的语法:

$ echo ${variable:+-option $variable}

$ variable=yes
$ echo ${variable:+-option $variable}
-option yes

答案4

以下一行代码即可:

[ x"$VARIABLE" = x ] && echo UNSET || echo SET

这将测试变量x"$变量"等于X换句话说,如果$变量为空;如果测试满足,则第一个选项(回显 UNSET)被执行,如果测试不是满足最后一个选项被执行(回显设置)。如果您不想在第二种情况下执行任何操作,您可以执行

[ x"$VARIABLE" = x ] && echo UNSET || :

这比其他解决方案简单得多,只允许对条件进行一次评估,并且对于 VARIABLE 中出现的奇怪字符具有很强的鲁棒性。

相关内容