bash에서 인용되지 않은 빈 변수가 확장되는 이유는 무엇입니까?

bash에서 인용되지 않은 빈 변수가 확장되는 이유는 무엇입니까?

종료 상태를 반환하기 위해 인용되지 않고 선언되지 않은 변수는 어떤 값으로 확장됩니까 0?

내가 겪은 특정 상황의 예는 다음과 같습니다.

[ -n $var ]; echo $?
0

[ -n "$var" ]; echo $?
1

var두 테스트 모두 변수가 선언되지 않았습니다. 를 사용하여 테스트하면 문제를 해결할 수 있었는데 -z, 인용 여부는 분명히 차이가 없습니다. 하지만 이 특별한 경우에 부딪혀 궁금해지기 시작했습니다. 나는 bash가 수행하는 모든 확장을 더 깊이 파고 들었지만 이 동작에 대한 설명을 찾을 수 없었습니다.

일반적으로 나는 변수를 인용하지만, 이러한 행동의 이유가 인용을 더 잘 이해하는 데 도움이 되기를 바랍니다.

답변1

, 명령은 상황에 따라 다른 작업을 수행하기 때문에 test모두 동일하게 작동합니다 .[[[얼마나 많은 매개변수를 제공합니까? (마무리 단어 제외 ]/ ]]).

  • 매개변수가 1개 있습니다. 매개변수가 비어 있지 않으면 테스트가 성공합니다.
  • 인수가 2개 있는 경우 인수는 단항 연산자(예: -n) 및 피연산자로 처리됩니다.
  • 3개의 매개변수를 사용하면 매개변수는 하나의 피연산자, 이항 연산자(예: =) 및 다른 피연산자 로 처리됩니다.
  • 인수가 3개 이상 test이면 ["인수 너무 많습니다" 오류가 발생하며 [[다른 오류가 발생할 수도 있습니다(파서가 더 복잡함).

[ -n $var ]이제 예시를 보고 [[구성과 비교해 보세요. [[니가 안 하니까분사, 변수 값이 어디에 있는지 알고 있습니다. var=""주어진 [[ -n $var ]]인수가 확장되면 bash는 어떤 [[ -n "" ]]항목이 무엇인지 명확하게 알 수 있습니다.잘못된.

그러나 testand 의 경우에는 [분사가 유효합니다. 그래서 [ -n $var ] 됩니다 [ -n ](빈 문자열은 사라집니다). 이제 [논쟁을 보자비어 있지 않은 문자열입니다., 그렇군요진짜.

변수를 인용하면: [ -n "$var" ]예상했던 잘못된 결과를 얻게 됩니다.

관련 정보