DEV Community

loading...

Discussion on: Handling Arguments in Bash Scripts

Collapse
exadra37 profile image
Paulo Renato

Very nice article but I would like to suggest you another approach to deal with missing arguments...

Don't allow variables not set:

#!/bin/bash

set -eu

# will crash with:
# /home/exadra37/bin/test.sh: line 6: $1: unbound variable
echo $1

Give it a default value:

#!/bin/bash

set -eu

ARG="${1:-default value for argument 1}"

# will output:
# ARG1: default value for argument 1
echo "ARG1: ${ARG}"

or make it a required argument:

#!/bin/bash

set -eu

# /home/exadra37/bin/test.sh: line 5: 1:  Missing value for argument 1
ARG="${1? Missing value for argument 1}"

Collapse
kgoutham93 profile image
Goutham Kolluru

What other options of set are typically used in bash scripts?

Collapse
moopet profile image
Ben Sinclair

-x prints out every command as it's run, which can be fun (if verbose) for debugging.

Collapse
rpalo profile image
Ryan Palo Author

Usually I see set -o errexit, set -o nounset, and set -o pipefail as safety catches. Ben is right on about set -x. That’s a great one for debugging. Googling or running ‘man set’ will give you a bunch more info :)

Collapse
rpalo profile image
Ryan Palo Author

You're totally right, this is a good way to do it too. Thanks! Personally, I don't like set -u, because I like having blank variables, but I'm aware that maybe that makes me weird.

That being said, knowing about default and required parameter syntax is a really useful and important skill, and I'm definitely going to add it to my "Advanced Argument Handling" post. Thanks for bringing it up!

Collapse
exadra37 profile image
Paulo Renato • Edited

The -u flag have saved me a lot of bugs and can save you to delete the wrong path in your disk rm -rf ~/${UNSET_VAR} will be a disaster when used in some script.

If you like to have empty vars in your script then be explicit and initiate them with VAR="".

Thread Thread
xanderxaj profile image
Alex Palmer • Edited

This reminds me of that time running Steam (the PC video game client) would delete everything your user could delete on Linux.

It ran this code:

rm -rf "$STEAMROOT/"*

Moving the Steam install location would cause STEAMROOT to be blank...

rm -rf "/"*

Let's hope you didn't run it as root.