![테스트 명령과 [[]]로 둘러싸인 단일 조건식의 차이점은 무엇입니까? [복사]](https://linux55.com/image/177783/%ED%85%8C%EC%8A%A4%ED%8A%B8%20%EB%AA%85%EB%A0%B9%EA%B3%BC%20%5B%5B%5D%5D%EB%A1%9C%20%EB%91%98%EB%9F%AC%EC%8B%B8%EC%9D%B8%20%EB%8B%A8%EC%9D%BC%20%EC%A1%B0%EA%B1%B4%EC%8B%9D%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
zsh의 조건식 부분을 배우고 있는데 말이 안되는 출력이 표시됩니다.
예를 들어:
$ mkdir emptyspace && cd emptyspace
$ var_assigned_with_emptystring=""
$ [[ -n $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a nonzero-len string!'
$ [[ -n "" ]] && echo '"" is a nonzero-len string!'
$ test -n $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a nonzero-len string by test!'
var_assigned_with_emptystring is a nonzero-len string by test!
$ test -n "" && echo '"" is a nonzero-len string by test!'
----------
$ [[ -z $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a zero-len string!'
var_assigned_with_emptystring is not an empty string!
$ [[ -z "" ]] && echo '"" is a zero-len string!'
"" is a zero-len string!
$ test -z $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a zero-len string by test!'
var_assigned_with_emptystring is a zero-len string by test!
$ test -z "" && echo '"" is a zero-len string by test!'
"" is a zero-len string by test!
with가 with 인지 option인지에 상관없이
test
with가var_assigned_with_emptystring
항상 올바른 결과를 제공하는 이유는 무엇 입니까 ? 둘러싸인 명령과 단일 조건식의 차이점은 무엇입니까 ?-n
-z
test
[[]]
""
이들그리고 그리고 의 차이점은 무엇인가요var_assigned_with_emptystring
? 매개변수는""
테스트 함수에 의해 내부적으로 처리될 때와 동일한 값 으로 확장(또는 평가)되어야 한다고 생각합니다 . 하지만test -n $var_assigned_with_emptystring
다른 반환 상태를 제공합니다test -n ""
답변1
이는 주로 다룬다.따옴표가 없는 공백 매개변수 확장이 이중 괄호 "[[" 내에서는 작동하지만 단일 괄호 "[" 내에서는 작동하지 않는 이유는 무엇입니까?. 간단히 말해서 는 [[ … ]]
다른 구문 분석 규칙을 사용하는 특수 구문인 반면 test
및 [
은 일반 명령입니다.
일반 형식 sh
( ksh
, 등 포함)에서는 bash
큰따옴표 누락으로 인해 test -n $var
값에 분할 및 와일드카드가 적용됩니다 . var
이중 괄호 안에는 이런 일이 발생하지 않습니다.
차이점 zsh
은 zsh
대부분의 경우 변수 확장에 큰따옴표를 사용할 필요가 없다는 것입니다. 그러나 목록 컨텍스트(예: 명령줄) $var
사이에는 한 가지 차이점이 있습니다 "$var"
. 단어가 비어 있고 따옴표가 없으면 zsh
제거됩니다. 따라서 인수 var
가 하나인 명령은 값이 비어 있으면 "true"이고 test -n $var
, 비어 있지 않은 인수가 하나인 명령은 "true"입니다. 그러나 두 개의 매개변수와 빈 문자열을 사용하여 "false"인 빈 문자열에 테스트를 적용하는 명령입니다.test
-n
test
test -n "$var"
test
-n
-n
내부적으로 [[ … ]]
는 null 단어 제거가 발생하지 않으므로 [[ -n $var ]]
와 는 [[ -n "$var" ]]
동일합니다.