Pasar parámetros condicionalmente a un script

Pasar parámetros condicionalmente a un script

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 condno está vacío (independientemente de si es cond=falseo cond=0en lugar de cond=true), el valor de p2se 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}

información relacionada