Bash manual says:
A parameter is set if it has been assigned a value. The null string is
a valid value.…
If value is not given, the variable is assigned the null string.
Is the null string the same as ""?
Are their lengths both zero? Can both be tested by conditional expressions -z or -n which tests if the length of a string is zero or nonzero?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Yes, a null string in that context is a string of length 0 containing no byte at all. In 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`"
But also in bash, as a side effect of bash (contrary to zsh) not supporting NUL bytes in its variables (as it uses NUL-delimited C strings internally):
var=$'' var=$'u0000' var=$'<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f192b1">[email protected]</a>' var=$'x00' var=$''
In all those cases, $var will be set but contain nothing (the null string). echo "${#var}" will output 0, [ -z "$var" ] will return true and printf %s "$var" will output nothing.
After unset var (but beware of the bug/misfeature of bash, mksh and yash where unset may reveal a version of $var from an outer scope instead of unsetting it if you’re doing that from a function called from another function that had declared the variable local), $var has no value, null or not.
However $var still expands to nothing (to the null string) unless the nounset option is on. There are other differences between unset variables and variables assigned an empty value:
${var?}triggers an error when$varis unset${var+x}expands toxif$varhas any value (even null)${var-x}expands toxif$varis unset[[ -v var ]]returns false if$varis unset- if the variable is marked for
export, thenvar=is passed in the environment of every command if it’s set, or not passed at all otherwise.
Method 2
Yes. Using the test from this answer:
$ [ -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
So setting the variable to "" is the same as setting it to empty value. Therefore, empty value and "" are the same.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0