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.