This is an interesting idea and from the looks of it well executed, but I am having trouble imagining a scenario were I would prefer to use Amber over a scripting language like Python. If your bash scripts are getting long enough to warrant the use of Amber you are probably already in a situation where you can justify installing Python.
Linux
A community for everything relating to the GNU/Linux operating system (except the memes!)
Also, check out:
Original icon base courtesy of lewing@isc.tamu.edu and The GIMP
I agree, but I can envision scenarios where you are integrating into someone else's workflow/machine and they (or their build system etc.) are expecting a shell script. Python is ubiquitous but sometimes you just want to work like everything else.
Also useful for scripts to be executed inside containers. Alpine doesn't have Python installed by default.
One reason is that Python is not built-in on macOS anymore, so it's hard to justify using it for management scripts. Particularly when you do not have control of the execution environment to begin with. I've written some obnoxiously complicated bash (or zsh) scripts because I want to make sure it will run on a vanilla Mac with no additional dependencies. 10 years ago I would've done all that stuff in Python, but not anymore. Thanks, Apple!
From a technical perspective, sure, I could push out a portable python environment and it wouldn't affect the rest of the system. But that comes at a cost. I don't want to fight for it, and I don't want to be responsible for maintaining it. It's easier to just use bash/zsh.
Python is also too heavy for some embedded devices. Not sure if I can count on Amber scripts to run in a busybox environment but maybe?
That said, if the question is "is it worth learning a whole new thing when I already know bash/zsh", I am not so sure. But in principle, I dig it, regardless of how practical it is with my specific background and needs. I mean, if I learned about this 20 years ago I feel like I might still be reaping rewards.
I didnt realize it could go to different bash versions.
That could actually be really handy for me, write once and out for the versions I need...
When do you need a newer or older version of Bash to target? I mean usually this is not a thing to concern about.
Client systems outside of my control.
It is not usually a thing to be concerned about. It is something I end up having to be concerned about though.
You have my deepest condolences.
Its an interesting life I suppose.
I don't like it.
Interesting. There is this example in the docs:
let result = $ cat file.txt | grep "READY" $ failed {
echo "Failed to read the file"
}
https://docs.amber-lang.com/basic_syntax/commands
How can we know for sure what failed here? Was it the cat or the grep? My instinct says the pipe returns the code of the last cmd or failure, which could be either.
Perhaps it's just a contrived example and it would be better to separate testing file existence from grepping in real code...
Yep, the code you provided is compiled into this:
command_0="$(cat file.txt | grep "READY")"
__status=$?
if [ "${__status}" != 0 ]; then
echo "Failed to read the file"
fi
So, the outcome would depend on the pipefail option. (set -o pipefail)
As you suggested, an Amberic snippet would be:
import { file_read } from "std/fs"
import { match_regex } from "std/text"
const result = file_read("file.txt") failed {
echo "Failed to read the file"
}
if match_regex(result, "READY"):
echo "file.txt contains READY"
Thanks for that, makes sense. I like that Amber gives the ability to code more defensively/robustly where appropriate but can also get out the way if you just need to run a bunch of BASH raw.
I'm reminded of the horrid example showcased on the amber-lang website previously.

[ "$age" \< 18 ] && {
echo "I'm not an adult yet"
} || {
echo "I'm an adult"
}
if you want to be using braces in if statements lol
They know you can just do if ((age < 18)) in bash, right?
Or rather if ((10#$age < 18)) because age=021 would not be adult 😉 Hopefully, they protect against that at least.
(I had to double-check this stupid default is still a thing, since I moved to zsh many years ago.)
bc can handle extended-precision integers, unlike bash which maps them to floats.
My most recent Bash mistake was misusing test -n and test -z. In Amber, I can just use something == "" or len(something) == 0
test -n can be [ "$something" ] and test -z can be [ "$something" = "" ]
And this applies to posix shell, not just bash.
Thank you for this comment. I'm revisiting this comment because I need to write this...

I just installed fish shell a few years ago. Best scripting language I've come across. No need to remember all this weird bash syntax you have to look up every time you want to use it. All of fish shell fits in your working memory, seriously. It's tiny.
Fish is my main shell of choice and I use my self-written functions(https://github.com/lens0021/Lens0021_Personal.Fish/blob/main/conf.d/lens0021_personal.fish) daily. But it is hard for me to say Fish's syntax is not weird. Especially, I'm a little fuzzy on how to use argparse. I am sorry.
In which way is it weird? It's different, but how is it weird?
No need to apologize, you're allowed your opinions and feelings.
I would suggest reading the manual page for argparse thoroughly from top to bottom of you haven't already. I struggled with argparse at first too, but it's because I skimmed the manual instead of reading it.
I would also read through all of the manual, and you'll find useful idiomatic fish things like not setting PATH directly, but using fish_add_path, among other things. 👍
I've never heard of this before but I'll make sure to check it out.
Nice. I find the bash syntax so clunky...