有条件地将参数传递给脚本

Jim*_*Jim 18 bash shell-script

我有一个在 Linux 上运行的脚本,它接受一些参数。
我想做类似的事情:

if [[ $CONDITION == "true" ]]; then  
  script param1 --param2  
else
  script param1  
fi 
Run Code Online (Sandbox Code Playgroud)

我想避免if的分叉路径。
有没有更优化的方法来传递第二个参数?

ilk*_*chu 29

最可扩展和最健壮的方法可能是使用数组来保存可选参数:

params=()
if [[ $CONDITION == true ]]; then
    params+=(--param2)
fi
script param1 "${params[@]}"
Run Code Online (Sandbox Code Playgroud)

或者简写:

[[ $CONDITION == true ]] && params+=(--param2)
script param1 "${params[@]}"
Run Code Online (Sandbox Code Playgroud)

这避免了重复命令的常量部分,并且您可以在数组中放置多个参数,甚至整个命令。

请注意,使用数组执行此操作很重要:如果您将数组替换为常规变量 ( params="--param2"; script param1 $params),您要么必须不加引号地展开该变量(包含所有带来的问题),要么将其展开加引号,在这种情况下,您如果变量为空,将传递一个空字符串作为参数。

在像这样的简单情况下,也可以使用“替代值”扩展:

cond=x
p2="--param2"
script param1 ${cond:+"$p2"}
Run Code Online (Sandbox Code Playgroud)

在这里,如果cond是非空的(不管它是cond=false还是cond=0代替cond=true),p2扩展了 的值。这可能被视为没有数组那么难看,但要小心引号的位置。

也可以看看:


ImH*_*ere 6

一种通用的方法是在数组中设置参数。最基本的数组是用 定义的位置参数列表set。您可以按顺序构建参数列表。

set -- param1
if [[ $CONDITION == "true" ]]; then  
    set -- "$@" --param2  
fi 

command "$@"  
Run Code Online (Sandbox Code Playgroud)

可以简化为:

set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"  
Run Code Online (Sandbox Code Playgroud)

如果需要保留位置参数列表,则: