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.
