Como inicializar variáveis para um script

4

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

    
por Jim 05.12.2017 / 11:21

3 respostas

1

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.

    
por 05.12.2017 / 12:05
1

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.

    
por 05.12.2017 / 16:41
0

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.

    
por 20.12.2017 / 15:53