스크립트에서 사용할 수 있는 일부 기능이 포함된 파일이 있습니다.
그래서 내 스크립트에서는 다음을 수행합니다.
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
기본 스크립트를 덜 혼란스럽게 만들 수 있는 몇 가지 사항이 있습니다.
값을 확인할 수 없는 경우 함수가 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이 아닌 값을 반환하는 즉시 쉘이 종료됩니다).위의 내용에 추가로 또는 대신에 를 사용하면
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 파일에 배치하여 스크립트에서 꺼낼 수 있습니다.