Shell: ["$myvar" = 0] 대신 [x"$myvar" = x0]인 이유 / 테스트 변수에 알파 문자를 추가하는 이유는 무엇입니까? [복사]

Shell: ["$myvar" = 0] 대신 [x"$myvar" = x0]인 이유 / 테스트 변수에 알파 문자를 추가하는 이유는 무엇입니까? [복사]

어딘가에 중복된 것이 있을 수도 있지만(제 생각에는) 찾지 못했습니다.

일부 스크립트에서 이와 같은 테스트가 표시되는 이유는 무엇입니까?

if [ x"$quiet_boot" = x0 ]

x테스트의 실제 변수 앞에 하나를 추가하시겠습니까? 나는 확인했다이 관련 질문그러나 셸이 설정되지 않은 변수를 사용하자마자 스크립트를 중지하도록 구성되면 설정되지 않은 변수 문제를 방지하려고 합니다.

그럼 여기서 이걸 왜 사용하는 걸까요?

왜 그냥 쓰지 않습니까 if [ "$quiet_boot" = 0 ]?

답변1

실제로 찾았어요반복됨(두번째) 이 질문을 쓰는 동안 ...

문자 접두어를 추가하는 것은 실제로 해결 방법입니다.일부(대부분 레거시) test(일명 [) 쉘 컨텍스트에서 유틸리티 구현. 예를 들어, myvar같음 -o또는 -n이면 (어떤 경우에는 연산자와 혼동될 수 있습니다(say 접두사를 추가하면 이를 방지할 수 있습니다 x). 그런데 쉘은 의도적으로 작동하므로 test명령은 인수를 받을 때 주어진 특정 인수가 연산자인지 피연산자인지 확인할 수 없습니다.

test(1)매뉴얼은 다음과 같이 경고합니다.

참고: 바이너리 -a 및 -o는 본질적으로 모호합니다. 'Test EXPR2' 대신 'Test EXPR1 && Test EXPR2' 또는 'Test EXPR1 ||'을 사용하세요.

오늘 내 대시 sh구현은 다음과 같습니다.

b="("
test "AAA" = "AAA" -a "$b" = "BBB"
# yields "test: closing paren expected"

x"$b" = x"BBB"이는 두 가지 테스트를 통과하거나 통과함으로써 피할 수 있습니다 test "AAA" = "AAA" && test "$b" = "BBB".

a='='
b=x
test -n "$a" -a -n "$b"
# yields test: -a: unexpected operator

"$empty" = ""이는 (대신 -n) if -a또는 사용을 사용하여 피할 수 있는 모호성을 보여줍니다. -o따라서 x"$empty" = x이 경우 대괄호 문제를 해결하기 위해 접두사 ()가 사용됩니다.


일반적으로 지금은 다음과 같습니다.

  • 하나만 수행하는 것이 안전하며 test(최대 3개의 매개변수, use -o또는 use 없음 -a) 이 해결 방법이 필요하지 않습니다(오래된/버그가 있는 구현 제외).,
  • -o/ 를 사용하면 -a, 특히 피연산자가 연산자나 대괄호 /( 처럼 보일 때 모호하고 버그가 발생할 수 있습니다. 이 해결 방법이 도움이 될 수 있습니다.).

안전을 확보하려면 공백이 포함된 경우에도 항상 하나의 인수로 해석되도록 "$variables"전달된 인수를 항상 인용해야 합니다.test

자세한 내용은,스티븐 차제라스썼다꽤 포괄적인 답변이 질문을 읽어 보시기 바랍니다. 더 많은 단서가 더 쉽게 찾을 수 있는 정보를 가리킬 수 있도록 이 질문과 답변을 계속 게시하고 있습니다.

오늘날의 구현은 불분명한 동작을 초래하는 많은 레거시 구현 문제를 수정하므로 이러한 문제에 대해 say 또는 say를 x사용하지 않는 -o테스트를 접두사로 지정하는 -a것은 종종 불필요합니다.

관련 정보