다음은 환경 변수에 액세스하는 방법을 보여주는 간단한 셸 스크립트입니다.
if [[ ${x+X} = X ]] ## If $x is set
then
if [[ -n $x ]] ## if $x is not empty
then
printf " \$x = %s\n" "$x"
else
printf " \$x is set but empty\n"
fi
else
printf " %s is not set\n" "\$x"
fi
그러나 첫 번째 "if 조건"에 대해 다음과 같은 질문이 있습니다.
- [[ 연산자 내에서 비교를 위해 단일 "="가 사용됩니다. 하지만 =는 할당 연산자가 아닌가요?
- 이 스크립트에서 "${x+X}"가 무엇을 하는지 설명해 주실 수 있나요?
답변1
{ unset x
echo ${x+"you won't see this"}
x=
echo ${x+"this you'll see"} ${x:+"and this you won't"}
x=1
echo ${x+"now you'll"} ${x:+"see it all"}
}
this you'll see
now you'll see it all
실제로 모든 기본 POSIX 매개변수 확장은 :
선택적 콜론 수정자에 따라 확장 매개변수가 설정되지 않거나 null인 경우 다르게 동작합니다.
+
매개변수 확장 형태는 다음과 같이 확장됩니다.word
확장의 내용에 관계없이 매개변수를 설정할 때:
${parameter+word}
그러나 다음으로 확장되지는 않습니다.word
$parameter
설정 시기하지만 비어있다다음에서:
${parameter:+word}
-
, =
, 의 확장된 형태 도 있습니다 ?
. -
으로 확장될 예정 입니다.word
$parameter
언제설정되지 않음, 또는 :
설정되지 않았거나 null인 경우에 사용됩니다. null 또는 unset 값을 다음 과 같이 설정한다는 점을 제외하면 =
와 같은 방식으로 확장됩니다 .-
$parameter
word
. ?
선택사항을 작성하는 동안 쉘을 종료합니다 .word
$parameter
설정되지 않은 경우 stderr에 오류 메시지를 보내고 :
값이 NULL인 경우 stderr에 오류 메시지를 보냅니다. 이 세 가지 중 하나라도 해당된다면$parameter
예set 및 with 는 :
null이 아니며 $parameter
다른 경우와 마찬가지로 해당 값으로 확장됩니다.
답변2
=는 할당 연산자가 아닌가요?
예, 그렇습니다. 나타나는 위치에 따라 비교 연산자이기도 합니다. 많은 언어에서와 마찬가지로 토큰의 의미는 상황에 따라 다릅니다. Bash는 공식 할당 name=[value]
뿐만 아니라 test
(라고도 함 [
) 및 [[
;에 대한 표현 언어를 사용한 비교도 지원합니다. 다른 의미를 가지고 있습니다 =
.
무엇인가요 ${x+X}
?
Bash는 구문을 지원합니다 ${parameter:+word}
.
대체 값을 사용하십시오. null이거나 설정되지 않은 경우 아무것도 대체되지 않으며, 그렇지 않으면
parameter
확장이 대체됩니다.word
귀하의 경우 이는 x
설정되지 않은 경우 표현식이 빈 문자열로 확장되고(비교가 X
실패함), 설정된 경우 빈 문자열로 확장됨 X
(비교가 true가 됨)을 의미합니다.
구문은 설정되었지만 비어 있는 경우 약간 다른 ${parameter+word}
의 변형입니다 .${parameter:+word}
parameter
x ${x+alt} ${x:+alt}
------------ ---------- ----------
unset '' ''
set to '' alt ''
non-empty alt alt