Vinko 의 답변에 따르면 당신이 따르는 대답은 암시되어 있지만 (단, 명시되지 않은 경우) 단순히 철자가 아닙니다. VAR이 설정되었지만 비어 있는지 여부를 구별하려면 다음을 사용할 수 있습니다.
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
두 번째 줄의 두 테스트를 다음과 함께 하나로 결합 할 수 있습니다.
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
그러나 Autoconf에 대한 설명서를 읽으면 용어를 ' -a
'와 함께 사용하지 않는 것이 좋으며와 함께 별도의 간단한 테스트를 사용하는 것이 좋습니다 &&
. 문제가있는 시스템을 발견하지 못했습니다. 그렇다고 그들이 존재하지 않았 음을 의미하지는 않습니다 (그러나 먼 과거에 희귀하지 않았더라도 요즘에는 극히 희귀합니다).
Bash 매뉴얼에서 이들에 대한 세부 사항과 기타 관련 쉘 매개 변수 확장 , test
또는[
명령 및 조건식을 찾을 수 있습니다 .
나는 최근에 다음과 같은 질문에 대한 답을 이메일로 받았다.
두 가지 테스트를 사용하고 두 번째 테스트는 잘 이해하지만 첫 번째 테스트는 이해하지 못합니다. 더 정확하게는 변수 확장의 필요성을 이해하지 못합니다
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
이것이 동일하게 달성되지 않습니까?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
공정한 질문-대답은 '아니요, 더 간단한 대안은 같은 것을하지 않습니다'입니다.
테스트 전에 이것을 작성한다고 가정 해보십시오.
VAR=
테스트에는 "VAR이 전혀 설정되어 있지 않습니다"라고 표시되지만 "VAR이 설정되었지만 값이 비어있을 수 있습니다"라는 메시지가 나타납니다. 이 스크립트를 사용해보십시오 :
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
출력은 다음과 같습니다.
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
두 번째 테스트 쌍에서는 변수가 설정되지만 비어있는 값으로 설정됩니다. 이것이 ${VAR=value}
와 ${VAR:=value}
표기법 의 구별입니다 . 동감 ${VAR-value}
하고 ${VAR:-value}
,과 ${VAR+value}
및 ${VAR:+value}
등.
Gili 가 그의 대답 에서 지적한 것처럼 bash
, set -o nounset
옵션으로 실행 하면 위의 기본 대답이 실패합니다 unbound variable
. 쉽게 해결됩니다.
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
또는 ( 와 같음 ) 으로 set -o nounset
옵션을 취소 할 수 있습니다.set +u
set -u
set -o nounset