
Tengo un script ejecutándose en Linux que acepta algunos parámetros.
Me gustaría hacer algo como:
if [[ $CONDITION == "true" ]]; then
script param1 --param2
else
script param1
fi
Me gustaría evitar la bifurcación del if.
¿Existe una forma más óptima de pasar el segundo parámetro?
Respuesta1
La forma más amplia y robusta probablemente sería usar una matriz para contener los parámetros opcionales:
params=()
if [[ $CONDITION == true ]]; then
params+=(--param2)
fi
script param1 "${params[@]}"
O en forma abreviada:
[[ $CONDITION == true ]] && params+=(--param2)
script param1 "${params[@]}"
Eso evita repetir la parte constante del comando y puedes poner más de un argumento en la matriz, incluso el comando completo.
Tenga en cuenta que es importante hacer esto con una matriz: si reemplaza la matriz con una variable normal ( params="--param2"; script param1 $params
), tendrá que expandir la variable sin comillas, con todos los problemas que eso conlleva, o expandirla entre comillas, en cuyo caso Pasaremos una cadena vacía como argumento si la variable está vacía.
En un caso sencillo como este, también se puede utilizar la expansión de "valor alternativo":
cond=x
p2="--param2"
script param1 ${cond:+"$p2"}
Aquí, if cond
no está vacío (independientemente de si es cond=false
o cond=0
en lugar de cond=true
), el valor de p2
se expande. Esto puede parecer menos feo que las matrices, pero tenga cuidado con la colocación de las comillas.
Ver también:
Respuesta2
Una forma versátil de hacer esto es establecer los argumentos en una matriz. La matriz más básica es la lista de parámetros posicionales definidos con set
. Puede crear la lista de parámetros en secuencia.
set -- param1
if [[ $CONDITION == "true" ]]; then
set -- "$@" --param2
fi
command "$@"
Que podría reducirse a:
set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"
Si es necesario conservar la lista de parámetros posicionales, entonces:
Utilice una función:
callcommand(){ set -- param1 [[ $CONDITION == "true" ]] && set -- "$@" --param2 command "$@" } callcommand
O use alguna otra variable de matriz:
paramArray=() paramArray+=(param1) [[ $CONDITION == "true" ]] && paramArray+=( "--param2" ) command "${paramArray[@]}"
Respuesta3
PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then
PARAMS+=" --param2"
fi
script ${PARAMS}