this post was submitted on 05 Mar 2025
193 points (99.5% liked)
Programmer Humor
34509 readers
275 users here now
Post funny things about programming here! (Or just rant about your favourite programming language.)
Rules:
- Posts must be relevant to programming, programmers, or computer science.
- No NSFW content.
- Jokes must be in good taste. No hate speech, bigotry, etc.
founded 5 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Here's an example, I have looked up many times (like just now), which checks whether a string is empty:
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.
-z
means zero length and mostly[[ ]]
are used when you want to add multiple conditions. But there are also few test cases which are only in bash so they also need double bracketsYou 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:
?
There isn't. The syntax is
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: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: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>
):So,
-z
stands for Zero.Hope this helps you remember it!