Contrary to popular belief, BASH has some type safety if you declare
your variables with typeset or declare.
Rant
These two BASH builtins, typeset and declare are synonyms, but
since typeset also works in Korn Shell (ksh) I use that keyword to
make my code a bit more portable. Perhaps silly since I also advocate
writing pure BASH and not worry about following the POSIX Utilities
spec as BASH is such a much richer language than sh and it's
available on all platforms I care about these days. In any case,
onwards:
Integers
typeset -i age=20
printf "Age is %s\n" "${age}"
typeset -i age=foo
printf "Age is %s\n" "${age}"
typeset -i age=85
printf "Age is %s\n" "${age}"
Running this produces:
$ ./declaring-variables.sh
Age is 20
Age is 0
Age is 85
As you can see, BASH guarantees that the variable stays an integer even if some piece of code assigns a string to it.
Lowercase string
typeset -l always_lowercase=FOO
BASH guarantees that all strings written to this variable are stored as lowercase:
$ echo "${always_lowercase}"
foo
Uppercase string
typeset -u always_uppercase=bar
BASH guarantees that all strings written to this variable are stored as uppercase:
$ echo "${always_uppercase}"
BAR
Arrays
As you probably already know, you declare arrays with declare -a or
typeset -a. What you may not know, is that you can also make the
variable a constant, making modifications of this variable a runtime
error:
typeset -a -r COMPASS=(
"north"
"west"
"south"
"east"
)
for direction in "${COMPASS[@]}"; do
printf "%s\n" "${direction}"
done
COMPASS=(
"down"
"up"
"nowhere"
"somewhere"
)
for direction in "${COMPASS[@]}"; do
printf "%s\n" "${direction}"
done
Running this produces:
$ ./declaring-variables.sh
north
west
south
east
declaring-variables.sh: line 25: COMPASS: readonly variable
I bet you didn't know BASH had these features, I for sure didn't! 😉