빈 문자열과 ""는 같은 문자열인가요?

빈 문자열과 ""는 같은 문자열인가요?

Bash 매뉴얼은 다음과 같이 말합니다:

매개변수에 값이 할당된 경우 매개변수가 설정됩니다. 빈 문자열은 유효한 값입니다.

...

값이 지정되지 않으면 변수에 빈 문자열이 할당됩니다.

빈 문자열은 와 동일합니까 ""?

길이가 모두 0인가요? 둘 다 조건식으로 테스트 -z하거나 -n문자열 길이가 0인지 0이 아닌지 테스트할 수 있습니까?

답변1

예, 해당 맥락에서 빈 문자열은 바이트가 전혀 포함되지 않은 길이가 0인 문자열입니다. 존재하다 bash:

var=
var=''
var=""
var=$''
var=$""
var=$(true) # or any command that outputs nothing or only newline
            # characters
var=`true`
var=${null_or_unset_var}
var=''""$''$""$(true)"`true`"

그러나 에서도 부작용으로 bash변수에서 NUL 바이트를 지원하지 않습니다(내부적으로 NUL로 구분된 C 문자열을 사용하기 때문).bashzsh

var=$'\0'
var=$'\u0000'
var=$'\c@'
var=$'\x00'
var=$'\0\0\0\0\0'

이러한 모든 경우에는 $var설정되지만 아무것도 포함되지 않습니다(빈 문자열). echo "${#var}"출력 0하고 [ -z "$var" ]true를 반환하며 printf %s "$var"아무것도 출력하지 않습니다.

나중에 unset var(하지만 bash변수를 선언하는 다른 함수에서 호출된 함수에서 이 작업을 수행하는 경우 설정을 해제하는 대신 외부 범위의 버전을 표시 mksh할 수 있으므로 yash주의 하세요.unset$var현지의), $varnull 여부에 관계없이 값이 없습니다.

그러나 $var이 옵션을 설정하지 않으면 여전히 null(빈 문자열)로 확장됩니다. nounset설정되지 않은 변수와 null 값이 할당된 변수 사이에는 다른 차이점이 있습니다.

  • ${var?}$var설정되지 않은 경우 트리거 오류
  • ${var+x}값이 있는 x경우 (Null도 포함) 로 확장됩니다 .$var
  • ${var-x}x$var설정되지 않은 경우 다음으로 확장됩니다.
  • [[ -v var ]]$var설정되지 않은 경우 false를 반환합니다.
  • 변수가 표시되면 설정된 후 각 명령의 환경에 전달되고, 그렇지 않으면 전혀 전달되지 않습니다 export.var=

답변2

예. 테스트 사용이 답변:

$ [ -n "${a+1}" ] && echo "defined" || echo "not defined"
not defined
$ a=""
$ [ -n "${a+1}" ] && echo "defined" || echo "not defined"
defined
$ b=
$ [ -n "${b+1}" ] && echo "defined" || echo "not defined"
defined

따라서 변수를 설정하는 ""것은 변수를 null 값으로 설정하는 것과 같습니다. 따라서 null 값과 ""동일합니다.

관련 정보