Não, o que você está fazendo é um padrão de codificação chamado "cláusulas de guarda" , que é uma boa coisa a fazer. Lidar com esses casos de erros triviais mais tarde no código pode torná-lo mais complicado do que o necessário.
Eu tenho um arquivo que tenho algumas funções para serem usadas por um script.
Então no meu script eu faço o seguinte:
source my_functions.sh
VALUE_A=$(get_proper_value "X")
[[ -z "$VALUE_A" ]] && echo "Missing value" && exit 1
THE_URL=$(get_url_of_service "SERVICE_NAME")
[[ -z "$THE_URL" ]] && echo "Missing URL" && exit 1
CUSTOMER_ID=$(generate_customer_id "Z")
[[ -z "$CUSTOMER_ID" ]] && echo "Missing customer id" && exit 1
etc
Tenho mais de 4 a 5 dessas declarações no topo do meu script antes de fazer qualquer processamento.
Isso parece confundir o roteiro.
Existe uma abordagem melhor para isso? Eu estava pensando em declarar as variáveis dentro de my_functions.sh
, mas eu queria saber se isso poderia piorar, já que não está claro onde essas variáveis estão vindo
Não, o que você está fazendo é um padrão de codificação chamado "cláusulas de guarda" , que é uma boa coisa a fazer. Lidar com esses casos de erros triviais mais tarde no código pode torná-lo mais complicado do que o necessário.
Bem, é claro que existem maneiras de tornar os testes mais breves, por exemplo, coloque a parte repetida em uma função
notempty() { for val; do [ -z "$val" ] && return 1; done; return 0; }
VALUE_A=$(...)
THE_URL=...
CUSTOMER_ID=...
notempty "$VALUE_A" "$THE_URL" "$CUSTOMER_ID" || { echo required variable not set >&2; exit 1; }
Mas isso não permite que você forneça uma mensagem de erro personalizada para cada variável. Como sobre o uso indevido de referências indiretas para, pelo menos, imprimir os nomes das variáveis?
notempty_ind() {
for var; do
if [ -z "${!var}" ]; then
echo "variable $var not set!" >&2;
return 1;
fi;
done;
return 0;
}
...
notempty_ind VALUE_A THE_URL CUSTOMER_ID || exit 1
Ou apenas substituindo o if
s pela ${parameter:?message}
expansão @ Kusalananda mencionado . Ele sai do shell e imprime uma mensagem de erro se o parameter
não estiver definido ou vazio. (Veja, por exemplo, o manual do Bash )
CUSTOMER_ID=...
: "${CUSTOMER_ID:?customer id not set!}" "${THE_URL:?}"
A mensagem de erro do Bash inclui o nome da variável, portanto, a mensagem personalizada não é realmente necessária, se o nome for claro o suficiente.
Continuando com as respostas do @xenoid e @ ilkkachu, com uma versão recente do bash você pode escrever isto, usando um variável nameref na função
guard_var() {
local -n var=$1
local value=$2
local desc=$3
if [[ $value ]]; then
var=$value
else
echo "Missing $desc"
exit 1
fi
}
guard_var valueA "$(get_proper_value "X")" "value"
guard_var theUrl "$(get_url_of_service "SERVICE_NAME")" "URL"
guard_var customerId "$(generate_customer_id "Z")" "customer id"
e a função guard_var
pode ser colocada em seu arquivo my_functions.sh para retirá-lo do script.
Tags bash shell-script variable