Program Tip

"set -o nounset"을 사용할 때 bash에서 변수가 설정되었는지 테스트

programtip 2020. 10. 5. 20:39
반응형

"set -o nounset"을 사용할 때 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

Oneliner는 어떻습니까?

[ -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.

당신은 사용할 수 있습니다 []대신 [[하고 ]]이상하지만, 후자는 배쉬에서 바람직하다.

Note what the colon does above. From the docs:

Put another way, if the colon is included, the operator tests for both parameter’s existence and that its value is not null; if the colon is omitted, the operator tests only for existence.

There is apparently no need for -n or -z.

In summary, I may typically just use [[ "${VAR:?}" ]]. Per the examples, this prints an error and exits if a variable is null or not set.


You can use

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

but

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

might be more readable.


While this isn't exactly the use case asked for above, I've found that if you want to use nounset (or -u) the default behavior is the one you want: to exit nonzero with a descriptive message.

It took me long enough to realize this that I figured it was worth posting as a solution.

If all you want is to echo something else when exiting, or do some cleanup, you can use a trap.

The :- operator is probably what you want otherwise.

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

반응형