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
'programing' 카테고리의 다른 글
PostgreSQL에서 기존 테이블에 자동 증분 기본 키를 추가하는 방법은 무엇입니까? (0) | 2023.05.17 |
---|---|
루프를 위해 튜플은 어떻게 풀립니까? (0) | 2023.05.17 |
긴 SQL 쿼리를 즉시 종료/정지하는 방법은 무엇입니까? (0) | 2023.05.12 |
배열에서 무작위로 선택하려면 어떻게 해야 합니까? (0) | 2023.05.12 |
jquery를 사용하여 div가 있는지 확인합니다. (0) | 2023.05.12 |