
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 cond
não está vazio (independentemente de ser cond=false
ou cond=0
em 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}