Да, пустая строка в этом контексте — это строка длины 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
, как побочный эффект bash
(, в отличие от zsh
), не поддерживающего байты NUL в своих переменных (, поскольку он использует внутри строки C с разделителями NUL -):
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
из внешней области вместо того, чтобы сбрасывать ее, если вы делая это из функции, вызванной из другой функции, которая объявила переменную local ), $var
не имеющей значения, null или нет.
Однако $var
по-прежнему заменяется ничем (на нулевую строку ), если не включена опция nounset
.Существуют и другие различия между неустановленными переменными и переменными, которым присвоено пустое значение :
${var?}
вызывает ошибку, когда $var
не установлено ${var+x}
расширяется до x
, если $var
имеет любое значение (, даже нулевое)${var-x}
расширяется до x
, если $var
не установлено [[ -v var ]]
возвращает false, если $var
не установлено export
, то var=
передается в окружении каждой команды, если она установлена, или не передается вообще в противном случае.