Why -z? I have no idea. I will also routinely forget the ]; then part. I believe, if you write the then onto the next line, then you don’t need the semicolon. And then someone’s probably gonna tell me to use double-brackets [[ ]] instead, which probably does something.
Arguably, I never fully learned Bash syntax, but it also is just a stupid if-statement. There shouldn’t be that much complexity in it.
Arguably, I never fully learned Bash syntax, but it also is just a stupid if-statement. There shouldn’t be that much complexity in it.
There isn’t. The syntax is
if COMMANDthenCOMMAND(s)...elseCOMMAND(s)...fi
I believe, if you write the then onto the next line, then you don’t need the semicolon.
Yes, but that’s true of all commands.
foo; bar; baz
is the same as
foobarbaz
All the ] and -z stuff has nothing to do with if. In your example, the command you’re running is literally called [. You’re passing it three arguments: -z, "$var", and ]. The ] argument is technically pointless but included for aesthetic reasons to match the opening ] (if you wanted to, you could also write test -z "$var" because [ is just another name for the test command).
Since you can logically negate the exit status of every command (technically, every pipeline) by prefixing a !, you could also write this as:
if ! test"$var"; then ...
The default mode of test (if given one argument) is to check whether it is non-empty.
Now, if you don’t want to deal with the vagaries of the test command and do a “native” string check, that would be:
My god… I’m so confused by your comment XD ! OP’s command is something I already came across, so I somehow got it… But your comment put me in total brain rot !
Here’s an example, I have looked up many times (like just now), which checks whether a string is empty:
var="" if [ -z "$var" ]; then echo "empty" else echo "not empty" fi
Why
-z
? I have no idea. I will also routinely forget the]; then
part. I believe, if you write thethen
onto the next line, then you don’t need the semicolon. And then someone’s probably gonna tell me to use double-brackets[[ ]]
instead, which probably does something.Arguably, I never fully learned Bash syntax, but it also is just a stupid if-statement. There shouldn’t be that much complexity in it.
You could write that as 1 line:
[ -z "$var" ] && echo "empty" || echo "no it aint"
Incidentally, this is an anti-pattern: http://mywiki.wooledge.org/BashPitfalls#cmd1_.26.26_cmd2_.7C.7C_cmd3
@Tangentism @Ephera Did you mean:
echo "${var:-empty}${var:+no it aint}"
?
There isn’t. The syntax is
if COMMANDthenCOMMAND(s)...elseCOMMAND(s)...fi
Yes, but that’s true of all commands.
is the same as
All the
]
and-z
stuff has nothing to do withif
. In your example, the command you’re running is literally called[
. You’re passing it three arguments:-z
,"$var"
, and]
. The]
argument is technically pointless but included for aesthetic reasons to match the opening]
(if you wanted to, you could also writetest -z "$var"
because[
is just another name for thetest
command).Since you can logically negate the exit status of every command (technically, every pipeline) by prefixing a
!
, you could also write this as:if ! test "$var"; then ...
The default mode of
test
(if given one argument) is to check whether it is non-empty.Now, if you don’t want to deal with the vagaries of the
test
command and do a “native” string check, that would be:case "$var" in "") echo "empty";; *) echo "not empty";;esac
Now this is enlightening
My god… I’m so confused by your comment XD ! OP’s command is something I already came across, so I somehow got it… But your comment put me in total brain rot !
From
man test
(note that[ <expr> ]
is just sugar fortest <expr>
):-n STRING the length of STRING is nonzero -z STRING the length of STRING is zero
So,
-z
stands for Zero.Hope this helps you remember it!