테스트 명령과 [[]]로 둘러싸인 단일 조건식의 차이점은 무엇입니까? [복사]

테스트 명령과 [[]]로 둘러싸인 단일 조건식의 차이점은 무엇입니까? [복사]

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!

  1. with가 with 인지 option인지에 상관없이 testwith가 var_assigned_with_emptystring항상 올바른 결과를 제공하는 이유는 무엇 입니까 ? 둘러싸인 명령과 단일 조건식의 차이점은 무엇입니까 ?-n-ztest[[]]

  2. ""이들그리고 그리고 의 차이점은 무엇인가요 var_assigned_with_emptystring? 매개변수는 ""테스트 함수에 의해 내부적으로 처리될 때와 동일한 값 으로 확장(또는 평가)되어야 한다고 생각합니다 . 하지만 test -n $var_assigned_with_emptystring다른 반환 상태를 제공합니다test -n ""

답변1

이는 주로 다룬다.따옴표가 없는 공백 매개변수 확장이 이중 괄호 "[[" 내에서는 작동하지만 단일 괄호 "[" 내에서는 작동하지 않는 이유는 무엇입니까?. 간단히 말해서 는 [[ … ]]다른 구문 분석 규칙을 사용하는 특수 구문인 반면 test[은 일반 명령입니다.

일반 형식 sh( ksh, 등 포함)에서는 bash큰따옴표 누락으로 인해 test -n $var값에 분할 및 와일드카드가 적용됩니다 . var이중 괄호 안에는 이런 일이 발생하지 않습니다.

차이점 zshzsh대부분의 경우 변수 확장에 큰따옴표를 사용할 필요가 없다는 것입니다. 그러나 목록 컨텍스트(예: 명령줄) $var사이에는 한 가지 차이점이 있습니다 "$var". 단어가 비어 있고 따옴표가 없으면 zsh제거됩니다. 따라서 인수 var가 하나인 명령은 값이 비어 있으면 "true"이고 test -n $var, 비어 있지 않은 인수가 하나인 명령은 "true"입니다. 그러나 두 개의 매개변수와 빈 문자열을 사용하여 "false"인 빈 문자열에 테스트를 적용하는 명령입니다.test-ntesttest -n "$var"test-n-n

내부적으로 [[ … ]]는 null 단어 제거가 발생하지 않으므로 [[ -n $var ]]와 는 [[ -n "$var" ]]동일합니다.

관련 정보