filmov
tv
Unix & Linux: Testing if a variable is empty in a shell script (4 Solutions!!)

Показать описание
Unix & Linux: Testing if a variable is empty in a shell script
The Question: I have seen the following technique used many times on many different shells,
to test if a variable is empty:
if [ "x$1" = "x" ]; then
# Variable is empty
fi
Are there any advantages on using this over the more canonical if [ -z "$1" ]?
Could it be a portability issue?
Solutions: Please watch the whole video to see all solutions, in order of how many people found them helpful
== This solution helped 5 people ==
the -z test is unsafe in some implementations, presumably when "interesting"
strings like "-o a=a" are tested.
== This solution helped 17 people ==
Some historical shells implemented a very simple parser that could get confused
by things like [ -n = "" ] where the first operand to = looks like an operator,
and would parse this as [ -n = ] or cause a syntax error. In [ "x$1" = x"" ],
the x prefix ensures that x"$1" cannot possibly look like an operator, and so
the only way the shell can parse this test is by treating = as a binary
operator.
All modern shells, and even most older shells still in operation, follow the
words be parsed correctly. So [ -z "$1" ] is a proper way of testing if $1 is
empty, and [ "$x" = "$y" ] is a proper way to test the equality of two
variables.
Even some current shells can get confused with longer expressions, and a few
expressions are actually ambiguous, so avoid using the -a and -o operators to
construct longer boolean tests, and instead use separate calls to [ and the
shell's own && and || boolean operators.
== This solution helped 3 people ==
The above tests will also cause an error if you run with "set -u" or "set -
o nounset"
A more stable way to check for an empty variable would be to use http://
MYVAR=${MYVAR:-"Bad Value"}
This method works for the traditional bourne shell, as well as ksh, and bash.
function isBlank {
valueNoSpaces=$(echo "$@" | tr -d ' ')
The Question: I have seen the following technique used many times on many different shells,
to test if a variable is empty:
if [ "x$1" = "x" ]; then
# Variable is empty
fi
Are there any advantages on using this over the more canonical if [ -z "$1" ]?
Could it be a portability issue?
Solutions: Please watch the whole video to see all solutions, in order of how many people found them helpful
== This solution helped 5 people ==
the -z test is unsafe in some implementations, presumably when "interesting"
strings like "-o a=a" are tested.
== This solution helped 17 people ==
Some historical shells implemented a very simple parser that could get confused
by things like [ -n = "" ] where the first operand to = looks like an operator,
and would parse this as [ -n = ] or cause a syntax error. In [ "x$1" = x"" ],
the x prefix ensures that x"$1" cannot possibly look like an operator, and so
the only way the shell can parse this test is by treating = as a binary
operator.
All modern shells, and even most older shells still in operation, follow the
words be parsed correctly. So [ -z "$1" ] is a proper way of testing if $1 is
empty, and [ "$x" = "$y" ] is a proper way to test the equality of two
variables.
Even some current shells can get confused with longer expressions, and a few
expressions are actually ambiguous, so avoid using the -a and -o operators to
construct longer boolean tests, and instead use separate calls to [ and the
shell's own && and || boolean operators.
== This solution helped 3 people ==
The above tests will also cause an error if you run with "set -u" or "set -
o nounset"
A more stable way to check for an empty variable would be to use http://
MYVAR=${MYVAR:-"Bad Value"}
This method works for the traditional bourne shell, as well as ksh, and bash.
function isBlank {
valueNoSpaces=$(echo "$@" | tr -d ' ')