"unary operator expected" error in Bash if condition

bash, shell

Solution

If you know you're always going to use Bash, it's much easier to always use the double bracket conditional compound command `[[ ... ]]`, instead of the POSIX-compatible single bracket version `[ ... ]`. Inside a `[[ ... ]]` compound, word-splitting and pathname expansion are not applied to words, so you can rely on

if [[ $aug1 == "and" ]];

to compare the value of `$aug1` with the string `and`.

If you use `[ ... ]`, you always need to remember to double quote variables like this:

if [ "$aug1" = "and" ];

If you don't quote the variable expansion and the variable is undefined or empty, it vanishes from the scene of the crime, leaving only

if [ = "and" ];

which is not a valid syntax. (It would also fail with a different error message if `$aug1` included white space or shell metacharacters.)

The modern `[[` operator has lots of other nice features, including regular expression matching.

Problem

This script is getting an error: ``` elif [ $operation = "man" ]; then if [ $aug1 = "add" ]; then # <- Line 75 echo "Man Page for: add" echo "" echo "Syntax: add [number 1] [number 2]" echo "" echo "Description:" echo "Add two different numbers together." echo "" echo "Info:" echo "Added in v1.0" echo "" elif [ -z $aug1 ]; then echo "Please specify a command to read the man page." else echo "There is no manual page for that command." fi ``` I get this error: ``` calc_1.2: line 75: [: =: unary operator expected ```

Original source

Related problems