基于 if 语句的 Bash 标志

the*_*eta 1 scripting bash shell-script

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

/home/username/myscript -a -b 76
Run Code Online (Sandbox Code Playgroud)

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

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

var=ON
/home/username/myscript 
if [ "$var" == "ON" ]; then
-a
fi
-b 76
Run Code Online (Sandbox Code Playgroud)

然而,这个方案在实施时不起作用。什么可以用来实现预期的结果?

ilk*_*chu 8

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

#!/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
Run Code Online (Sandbox Code Playgroud)

然后运行它:

"${cmd[@]}"
Run Code Online (Sandbox Code Playgroud)

注意最后一部分周围的引号,以及上面分配周围的括号。语法很难看,但它可以在包含空格等参数的情况下工作。(使用引号添加带空格的参数,例如cmd+=("foo bar")

相关的,使用不那么丑陋的方法和方式,它们可能会失败:


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

var=x
myscript ${var:+"-a"} -b 76
Run Code Online (Sandbox Code Playgroud)

在这里,${var:+foo}插入fooifvar不为空(所以var=ON, var=FALSE,var=x都会插入它),如果它为空或未设置(var=, 或unset var)则不插入。小心通常的引用问题。

  • +1这种语法很丑陋,而且更复杂,但解决方案是可扩展的,而我的解决方案更简单,但如果考虑更多标志组合,它会迅速演变成一团糟。 (2认同)

归档时间:

查看次数:

19376 次

最近记录:

5 年,5 月 前