programing

set -onnounset을 사용할 때 변수가 Bash에 설정되어 있는지 테스트

skycolor 2023. 5. 17. 22:38
반응형

set -onnounset을 사용할 때 변수가 Bash에 설정되어 있는지 테스트

다음 코드는 바인딩되지 않은 변수 오류와 함께 종료됩니다.이 문제를 해결하려면 어떻게 해야 합니까?set -o설정되지 않은 옵션?

#!/bin/bash

set -o nounset

if [ ! -z ${WHATEVER} ];
 then echo "yo"
fi

echo "whatever"
#!/bin/bash

set -o nounset


VALUE=${WHATEVER:-}

if [ ! -z ${VALUE} ];
 then echo "yo"
fi

echo "whatever"

이 경우에는,VALUE다음과 같은 경우 빈 문자열이 됩니다.WHATEVER설정되지 않았습니다.우리는 그것을 사용합니다.{parameter:-word}검색할 수 있는 확장man bash"파라미터 확장" 아래에 있습니다.

예상되는 결과를 얻으려면 변수를 인용해야 합니다.

check() {
    if [ -n "${WHATEVER-}" ]
    then
        echo 'not empty'
    elif [ "${WHATEVER+defined}" = defined ]
    then
        echo 'empty but defined'
    else
        echo 'unset'
    fi
}

테스트:

$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER='   '
$ check
not empty

한 줄기 사용:

[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"

-z빈 변수 또는 설정되지 않은 변수 모두를 확인합니다.

가정:

$ echo $SHELL

/bin/bash

$ /bin/bash --version | head -1

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

$ set -o nounset

대화형이 아닌 스크립트에서 오류를 인쇄하고 변수가 null이거나 설정되지 않은 경우 종료하려면 다음을 수행합니다.

$ [[ "${HOME:?}" ]]

$ [[ "${IAMUNBOUND:?}" ]]

bash: IAMUNBOUND: parameter null or not set

$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]

bash: IAMNULL: parameter null or not set

스크립트를 종료하지 않으려면 다음을 수행합니다.

$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."

$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."

Parameter null or not set.

$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."

Parameter null or not set.

사용할 수도 있습니다.[그리고.]대신에[[그리고.]]위에서, 그러나 후자가 바시에서 더 선호됩니다.

대장이 위에서 수행하는 작업을 기록합니다.설명서에서 다음을 참조하십시오.

즉, 콜론이 포함된 경우 연산자는 매개 변수의 존재 여부와 값이 모두 null이 아닌지를 테스트합니다. 콜론이 생략된 경우 연산자는 존재 여부만 테스트합니다.

의 필요성은 분명히 없습니다.-n또는-z.

요약하자면, 일반적으로 그냥 사용할 수 있습니다. 예제에 따르면, 이것은 오류를 출력하고 변수가 null이거나 설정되지 않은 경우 종료됩니다.

사용할 수 있습니다.

if [[ ${WHATEVER:+$WHATEVER} ]]; then

그렇지만

if [[ "${WHATEVER:+isset}" == "isset" ]]; then

가독성이 더 높을 수도 있습니다.

요청한 사용 사례가 정확하지는 않지만, 당신이 사용하고 싶다면,nounset(또는)-u기본 동작은 0이 아닌 상태에서 설명 메시지와 함께 종료하는 것입니다.

종료할 때 다른 내용을 반향하거나 정리를 수행하려는 경우 트랩을 사용할 수 있습니다.

:-연산자는 아마도 당신이 원하는 것일 것입니다.

저에게, 시험 행렬을 포함하지 않고, 대부분의 답은 기껏해야 혼란스럽습니다.또한 변수에 기본값이 포함된 시나리오를 다루지 않는 경우도 많습니다.

l0b0의 솔루션은 실제 질문 IMO와 관련하여 유일하게 읽을 수 있고 테스트 가능하며 올바른 솔루션이지만, 논리를 단순화하기 위해 테스트를 반전/재순서화하는 것이 올바른 결과를 생성하는지는 불분명합니다.최소화된 히르 용액

알레시의 (이미 축소된) 대비 솔루션은 선언되었지만 정의되지 않은 변수의 차이를 노출합니다.둘 중 하나가 당신의 시나리오에 맞을 수도 있습니다.

#!/bin/bash -eu

check1() {
    if [[ -n "${WHATEVER-}" ]]; then
        echo 'something else: not empty'
    elif [[ "${WHATEVER+defined}" = defined ]]; then
        echo 'something else: declared but undefined'
    else
        echo 'unset'
    fi
}

check2() {
    if [[ "${WHATEVER+defined}" != "defined" ]]; then
        echo 'unset'
    else
        echo "something else"
    fi
}

check3() {
    if [[ "${WHATEVER-defined}" = defined ]]; then
        echo 'unset'
    else
        echo 'something else'
    fi
}

check4() {
    if [[ ! ${WHATEVER+$WHATEVER} ]]; then
        echo 'unset'
    else
        echo 'something else'
    fi
}

echo
echo "check1 from l0b0"

unset WHATEVER
check1
WHATEVER=
check1
WHATEVER='   '
check1
WHATEVER='defined'
check1

echo
echo "check2 prove simplification keeps semantics"

unset WHATEVER
check2
WHATEVER=
check2
WHATEVER='   '
check2
WHATEVER='defined'
check2

echo
echo "check3 other promising operator?"

unset WHATEVER
check3
WHATEVER=
check3
WHATEVER='   '
check3
WHATEVER='defined'
check3

echo
echo "check4 other interesting suggestion, from aleš"

unset WHATEVER
check4
WHATEVER=
check4
WHATEVER='   '
check4
WHATEVER='defined'
check4
  • Check1그리고.Check2
  • Check3 틀렸습니다.
  • Check4정확합니다. 선언된/정의된 변수로 간주되는 값에 따라 달라집니다.
check1 from l0b0
unset
something else: declared but undefined
something else: not empty
something else: not empty

check2 prove simplification keeps semantics
unset
something else
something else
something else

check3 other promising operator?
unset
something else
something else
unset

check4 other interesting suggestion, from aleš
unset
unset
something else
something else

언급URL : https://stackoverflow.com/questions/7832080/test-if-a-variable-is-set-in-bash-when-using-set-o-nounset

반응형