Passar parâmetros condicionalmente para um script

Passar parâmetros condicionalmente para um script

Tenho um script rodando no Linux que aceita alguns parâmetros.
Eu gostaria de fazer algo como:

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

Eu gostaria de evitar a bifurcação do if.
Existe uma maneira mais ideal de passar o segundo parâmetro?

Responder1

A maneira mais expansível e robusta provavelmente seria usar um array para armazenar os parâmetros opcionais:

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

Ou abreviadamente:

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

Isso evita repetir a parte constante do comando e você pode colocar mais de um argumento no array, até mesmo o comando inteiro.

Observe que é importante fazer isso com um array: se você substituir o array por uma variável regular ( params="--param2"; script param1 $params), você terá que expandir a variável sem aspas, com todos os problemas que isso traz, ou expandi-la entre aspas, e nesse caso você ' passaremos uma string vazia como argumento se a variável estiver vazia.

Num caso simples como este, a expansão de "valor alternativo" também pode ser usada:

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

Aqui, if condnão está vazio (independentemente de ser cond=falseou cond=0em vez de cond=true), o valor de p2é expandido. Isso pode ser visto como menos feio que arrays, mas tome cuidado com o posicionamento das aspas.

Veja também:

Responder2

Uma maneira versátil de fazer isso é definir os argumentos em um array. A matriz mais básica é a lista de parâmetros posicionais definidos com set. Você pode construir a lista de parâmetros em sequência.

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

command "$@"  

O que poderia ser reduzido a:

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

Se a lista de parâmetros posicionais precisar ser preservada, então:

  • Use uma função:

    callcommand(){     set -- param1
                       [[ $CONDITION == "true" ]] && set -- "$@" --param2
                       command "$@"       
                 }
    callcommand
    
  • Ou use alguma outra variável de array:

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

Responder3

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

informação relacionada