基于 if 语句的 Bash 标志

基于 if 语句的 Bash 标志

我正在通过以下方式调用具有多个标志的 bash 脚本:

/home/username/myscript -a -b 76

为了说明这一点,-a 标志在 myscript 中执行某些操作,而 -b 标志在 myscript 中将某些参数设置为 76。

如何根据先前定义的变量使这些标志成为有条件的?例如,我只想在某个变量 var=ON 时使用 -a 标志,否则我不知道如何使用该标志。我正在寻找类似的东西:

var=ON
/home/username/myscript 
if [ "$var" == "ON" ]; then
-a
fi
-b 76

然而,这个计划实施后并没有发挥作用。可以用什么来达到预期的结果?

答案1

您可以在数组中构建命令:

#!/bin/bash
var=ON
cmd=( /home/username/myscript )   # create array with one element
if [ "$var" == "ON" ]; then
    cmd+=( -a )                   # append to the array
fi
cmd+=( -b 76 )                    # append two elements

然后运行它:

"${cmd[@]}"

请注意最后一部分的引号以及上面作业周围的括号。语法很丑陋,但它在面对包含空格等的参数时有效。 (使用引号添加带有空格的参数,例如cmd+=("foo bar")

相关的,不太丑陋的方法以及它们可能失败的方式:


在简单的情况下,就像这里的一个可选参数一样,您可以使用替代值扩展:

var=x
myscript ${var:+"-a"} -b 76

在这里,如果不为空则${var:+foo}插入(因此, ,都会插入它),如果为空或未设置(, 或)则不插入任何内容。请注意通常的引用问题。foovarvar=ONvar=FALSEvar=xvar=unset var

答案2

如果我理解正确的话:

var=ON
if [ "$var" = "ON" ]; then
    /home/username/myscript -a -b 76
else
    /home/username/myscript -b 76
fi

相关内容