종료 상태를 반환하기 위해 인용되지 않고 선언되지 않은 변수는 어떤 값으로 확장됩니까 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 "" ]]
항목이 무엇인지 명확하게 알 수 있습니다.잘못된.
그러나 test
and 의 경우에는 [
분사가 유효합니다. 그래서 [ -n $var ]
됩니다 [ -n ]
(빈 문자열은 사라집니다). 이제 [
논쟁을 보자비어 있지 않은 문자열입니다., 그렇군요진짜.
변수를 인용하면: [ -n "$var" ]
예상했던 잘못된 결과를 얻게 됩니다.