- cross-posted to:
- programmer_humor@programming.dev
- cross-posted to:
- programmer_humor@programming.dev
I gave up Bash scripting. I explicitly do “shell scripting” now, where “shell” is implied to be a POSIX compliant shell of any type.
But, but like … hear me out.
echo $((1+1))
I’m not very acquainted with any programming language so maybe I’m wrong here (or I didn’t get the joke? XD) but bash didn’t change much in the past few years, I even read some scripts more than 10 years still works because the syntax stays the same (or doesn’t change a lot …)
Compared with the switch from python 2 -> python 3 I read a lot of people pulling their hair off xD
the joke is that bash syntax is terrible and you always forget how to do basic things in it after not touching it for a while
i forget on the same day; i literally keep a log of everything i did that day so i can look it up. lol
Okay XD it’s less funny when you have to explain the joke XD sorry !!
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.
-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 bracketsArguably, 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 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
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 !
Now this is enlightening
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
Why -z? I have no idea.
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!
Only sorta related, but now I have an excuse to tell my anecdote…
One job ago I had a manager who decided that he would convert some of our helper scripts from bash to Python for reasons. I was new there and so didn’t realize what he was doing, or that he had started the process just as I was going through orientation. However, I ended up being the reviewer for the PR.
This was the worst Python I had ever seen but in such odd ways and it mostly worked. It almost felt like it was written by someone who knew bash really well but had never learned any other languages, or thought that bash was just so damn good that he wanted to turn every other language into it. For example, instead of using
argparse
he was manually looping throughargv
and parsing them one at a time. And instead of using a standardfor each in foo
loop, there were index variables and while loops. And certainly there were no comprehensions or any understanding of the basic built in data structures other than using lists as arrays.So I did a review, assuming that this person was just really new to python and tried to gently coach him towards basic Pythonisms. His response was: “Oh yeah, I just ran them through ChatGPT and assumed it was all ok.”
I quit about two months later.
Yeah, that’s kind of my least favorite part about the existence of LLMs. Before, when someone wrote some code, there was a non-zero chance that they understood what they were doing and that the code is at least sane on a basic level. If they did some complex shit or even just wrote rather verbose code, you could be reasonably certain that they tried something simpler first.
Now, all of those assumptions are out the window. The biggest dumbass can generate code that looks alright at first glance and if you have to review it, you really don’t know how to interpret it or how much to explain when you find fairly obvious mistakes.
Thats sounds a lot like C, in bash you cans also do
for item in list; do echo $item; done
That twist at the end. Bloody hell.