When writing shell scripts, it’s often useful to accept some command line parameters. Â It’s even more useful to have some defaults for those parameters. Â Until now I’ve been using if statements to check if the parameter was empty, and if it was, to set it to the default value. Â Something like this:
#!/bin/bash
DB_HOST=$1
DB_NAME=$2
DB_USER=$3
DB_PASS=$4
if [ -z "$DB_HOST" ]
then
DB_HOST="localhost"
fi
if [ -z "$DB_NAME" ]
then
DB_NAME="wordpress"
fi
if [ -z "$DB_USER" ]
then
DB_USER="root"
fi
echo "Connecting to the database:"
echo "Host: $DB_HOST"
echo "Name: $DB_NAME"
echo "User: $DB_USER"
echo "Pass: $DB_PASS"
It turns out there is a much more elegant way to do this with shell parameter expansion. Â Here is how it looks rewritten:
#!/bin/bash
DB_HOST=${1-localhost}
DB_NAME=${2-wordpress}
DB_USER=${3-root}
DB_PASS=$4
echo "Connecting to the database:"
echo "Host: $DB_HOST"
echo "Name: $DB_NAME"
echo "User: $DB_USER"
echo "Pass: $DB_PASS"
This is so much better. Not only the script itself is shorter, but it’s also much more obvious what is going on. Â Copy-paste errors are much less likely to happen here too.
I wish I learned about this sooner.


