어딘가에 중복된 것이 있을 수도 있지만(제 생각에는) 찾지 못했습니다.
일부 스크립트에서 이와 같은 테스트가 표시되는 이유는 무엇입니까?
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
것은 종종 불필요합니다.