我有一个在 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=false
或cond=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}