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

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

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

if [[ $CONDITION == "true" ]]; then  
  script param1 --param2  
else
  script param1  
fi 

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

答案1

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

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

或者简写为:

[[ $CONDITION == true ]] && params+=(--param2)
script param1 "${params[@]}"

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

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

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

cond=x
p2="--param2"
script param1 ${cond:+"$p2"}

此处,如果cond为非空(无论它是cond=falsecond=0而不是cond=true), 的值p2都会扩展。这可能看起来没有数组那么难看,但要小心引号的位置。

也可以看看:

答案2

执行此操作的通用方法是将参数设置在数组中。最基本的数组是用 定义的位置参数列表set。您可以按顺序构建参数列表。

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

command "$@"  

可以简化为:

set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"  

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

  • 使用一个函数:

    callcommand(){     set -- param1
                       [[ $CONDITION == "true" ]] && set -- "$@" --param2
                       command "$@"       
                 }
    callcommand
    
  • 或者使用其他一些数组变量:

    paramArray=()
    paramArray+=(param1)
    [[ $CONDITION == "true" ]] && paramArray+=( "--param2" )
    command "${paramArray[@]}"
    

答案3

PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then  
  PARAMS+=" --param2"
fi
script ${PARAMS}

相关内容