=는 할당 연산자가 아닌가요?

=는 할당 연산자가 아닌가요?

다음은 환경 변수에 액세스하는 방법을 보여주는 간단한 셸 스크립트입니다.

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 조건"에 대해 다음과 같은 질문이 있습니다.

  1. [[ 연산자 내에서 비교를 위해 단일 "="가 사용됩니다. 하지만 =는 할당 연산자가 아닌가요?
  2. 이 스크립트에서 "${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 값을 다음 과 같이 설정한다는 점을 제외하면 =와 같은 방식으로 확장됩니다 .-$parameterword. ?선택사항을 작성하는 동안 쉘을 종료합니다 .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

관련 정보