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扩展了 的值。这可能被视为没有数组那么难看,但要小心引号的位置。
也可以看看:
一种通用的方法是在数组中设置参数。最基本的数组是用 定义的位置参数列表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)
如果需要保留位置参数列表,则:
使用一个函数:
callcommand(){ set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"
}
callcommand
Run Code Online (Sandbox Code Playgroud)或者使用其他一些数组变量:
paramArray=()
paramArray+=(param1)
[[ $CONDITION == "true" ]] && paramArray+=( "--param2" )
command "${paramArray[@]}"
Run Code Online (Sandbox Code Playgroud)