"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.
'Program Tip' 카테고리의 다른 글
차등 실행은 어떻게 작동합니까? (0) | 2020.10.05 |
---|---|
파스 트리와 AST의 차이점은 무엇입니까? (0) | 2020.10.05 |
Linux 커널 코드에서 __init는 무엇을 의미합니까? (0) | 2020.10.05 |
기본 제공 WPF IValueConverters (0) | 2020.10.05 |
Unity를 사용하여 ASP.NET Web API 컨트롤러에 종속성을 삽입 할 수 없음 (0) | 2020.10.05 |