여러 변수가 설정되어 있는지 테스트

여러 변수가 설정되어 있는지 테스트

스크립트의 어느 시점에서 구성 파일 이후 여러 변수가 설정되었는지 확인하고 source, 설정되지 않은 경우 사용자에게 누락된 변수에 대해 알려주는 실행을 중지하고 싶습니다. 나는 열심히 노력했다

for var in $one $two $three ; do
    ...

그러나 example이 $two설정되지 않으면 for 루프가 실행되지 않습니다 $two. 내가 시도한 다음 것은

for var in one two three ; do
    if [ -n ${!var} ] ; then
        echo "$var is set to ${!var}"
    else
        echo "$var is not set"
    fi
done

그러나 2가 설정되지 않은 경우에도 "2가 설정되지 않음" 대신 "2로 설정됨"이 표시됩니다.

모든 필수 변수가 설정되었는지 어떻게 확인할 수 있나요?

업데이트/솔루션:"세트"와 "세트이지만 비어 있음" 사이에 차이가 있다는 것을 알고 있습니다. 지금 사용하고 있습니다(감사합니다https://stackoverflow.com/a/16753536/3456281그리고 이 질문에 대한 답변)은 다음과 같습니다.

if [ -n "${!var:-}" ] ; then

따라서 var설정되었지만 비어 있으면 여전히 유효하지 않은 것으로 간주됩니다.

답변1

인용 오류입니다.

if [ -n "${!var}" ] ; then

미래 보장: 설정

set -x

코드를 실행하기 전에 문제가 표시됩니다. 코드에 추가하는 대신 다음을 사용하여 스크립트를 호출할 수 있습니다.

bash -vx ./my/script.sh

답변2

프로그램을 중지하려면:

N= 
${one?var 1 is unset} 
${two:?var 2 is unset or null}
${three:+${N:?var 3 is set and not null}}

그게 다야. 물음표 뒤의 각 메시지는 다음으로 인쇄됩니다.stderr및 상위 쉘사망 한.알았어, 그럼 안돼메시지 - 하나만 - 첫 번째 실패만 메시지를 인쇄하여 쉘이 종료됩니다. 나는 이러한 테스트를 다음과 같이 사용하는 것을 좋아합니다.

( for v in "$one" "$two" "$three" ; do
    i=$((i+1)) ; : ${v:?var $i is unset or null...} 
done ) || _handle_it

이것에 대해서는 할 말이 더 많아요여기.

답변3

필요한 유일한 것은 테스트에서 인용문입니다.

for var in one two three ; do
    if [ -n "${!var}" ] ; then
        echo "$var is set to ${!var}"
    else
        echo "$var is not set"
    fi
done

나를 위해 작동합니다.

답변4

당신은 추가할 수 있습니다

set -u

설정되지 않은 변수를 사용하려고 할 때 스크립트가 종료되도록 스크립트 시작 부분에 추가합니다.

이와 같은 스크립트

#!/bin/sh
set -u
echo $foo

결과는 다음과 같습니다

script.sh: 3: script.sh: foo: 매개변수가 설정되지 않았습니다.

대신 사용 하면 bash오류는 다음과 같습니다.

script.sh: 3행: foo: 바인딩되지 않은 변수

관련 정보