스크립트 변수를 초기화하는 방법

스크립트 변수를 초기화하는 방법

스크립트에서 사용할 수 있는 일부 기능이 포함된 파일이 있습니다.
그래서 내 스크립트에서는 다음을 수행합니다.

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  

실제로 처리를 수행하기 전에 스크립트 상단에 이와 같은 명령문이 4-5개 더 있습니다.
이것은 스크립트를 엉망으로 만드는 것 같습니다.

이를 수행하는 더 좋은 방법이 있습니까? 내부에 변수를 선언하려고 하는데 my_functions.sh변수가 어디에서 오는지 명확하지 않기 때문에 상황이 더 악화될지 궁금합니다.

답변1

아니요, 당신이 하고 있는 일은"보호 조항"이것은 좋은 일입니다. 코드 뒷부분에서 이러한 사소한 오류 조건을 처리하면 코드가 필요 이상으로 복잡해질 수 있습니다.

답변2

물론, 반복되는 부분을 함수에 넣는 것처럼 테스트를 더 짧게 만드는 방법도 있습니다.

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; }

그러나 이렇게 하면 각 변수에 대해 사용자 정의 오류 메시지를 제공할 수 없습니다. 간접 참조를 남용하고 최소한 변수 이름을 인쇄하는 것은 어떻습니까?

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

아니면 s를 @Kusalananda 확장명 if으로 바꾸세요 .${parameter:?message}언급하다. 설정되지 않았거나 비어 있으면 셸을 종료하고 오류 메시지를 인쇄합니다 parameter. (예를 들어배쉬 매뉴얼)

CUSTOMER_ID=...
: "${CUSTOMER_ID:?customer id not set!}" "${THE_URL:?}"

Bash의 오류 메시지에는 변수 이름이 포함되어 있으므로 이름이 충분히 명확하다면 사용자 정의 메시지가 실제로 필요하지 않습니다.

답변3

기본 스크립트를 덜 혼란스럽게 만들 수 있는 몇 가지 사항이 있습니다.

  1. 값을 확인할 수 없는 경우 함수가 0이 아닌 종료 코드를 반환하도록 설정을 사용하세요 return 1. 아니면 실제로 가지고 가세요종료이 스크립트는 exit.

    0이 아닌 종료 상태를 반환하도록 하면 변수를 이름으로 참조하는 데 사용할 수 있습니다.

    set -e
    
    generate_customer_id CUSTOMER_ID "Z"
    

    generate_customer_id여기서는 설정할 변수의 이름을 첫 번째 인수로 가정합니다 ( typeset -n var="$1"코드에서 사용되며 var=...something...반환하기 전에 설정됩니다). 두 번째 매개변수에 대한 고객 ID를 가져올 수 없으면 return 1. 그러면 기본 스크립트는 다음과 같은 이유로 종료됩니다 set -e(이로 인해 명령이 0이 아닌 값을 반환하는 즉시 쉘이 종료됩니다).

  2. 위의 내용에 추가로 또는 대신에 를 사용하면 set -u현재 설정되지 않은 변수의 값을 확장하려고 시도하는 즉시 스크립트가 종료됩니다.

답변4

사용할 수 있는 최신 버전의 bash를 사용하여 @xenoid 및 @ilkkachu의 답변에 대한 후속 조치이름 참조 변수기능상

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"

그리고 guard_var함수를 my_functions.sh 파일에 배치하여 스크립트에서 꺼낼 수 있습니다.

관련 정보