1

I have a basic string equality check in a Bash script, but the output is not as expected.

To reproduce, copy the code below into an executable file (called 'deploy' in my examples below).

#!/bin/bash

echo $1

if [[ "$1" -eq "--help" ]] || [[ "$1" -eq "-h" ]]; then
    echo "hello"
fi


If I run the script like so:

./deploy -h

The output is:

-h
hello

If I run the script like so:

./deploy --help

The output is:

-help

Why does the conditional statement not resolve to true?

John Kugelman
  • 349,597
  • 67
  • 533
  • 578
Charlie
  • 2,876
  • 19
  • 26
  • 4
    Possible duplicate of [How to compare strings in Bash](https://stackoverflow.com/q/2237080/608639), [How do I compare two string variables in an 'if' statement in Bash?](https://stackoverflow.com/q/4277665/608639), etc. – jww May 24 '19 at 21:46

1 Answers1

4

-eq compares integers. Use == or = to compare strings.

if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then
    echo "hello"
fi

You could omit the quotes. Variable expansions on the left-hand side of == are safe when using double brackets.

You can also use || inside the brackets. It's not possible to do that with single brackets, but double brackets are a syntactical feature with special parsing rules that allow it.

if [[ $1 == --help || $1 == -h ]]; then
    echo "hello"
fi

If it gets more complicated you might also consider a case block.

case $1 in
    -h|--help)
        echo "hello";;
esac

If -eq is for numerical comparison, how come ./deploy -h worked as expected?

Arithmetic evaluation normally prints an error message when given illegal expressions, but as it happens the two strings you're asking it to evaluate are syntactically valid.

  • -h negates the value of the undefined variable $h. The result is 0.
  • --help is decrements the undefined variable $help. The result is -1.

Try an invalid string and you'll get an error.

$ ./deploy 'foo bar'
bash: [[: foo bar: syntax error in expression (error token is "bar")
$ ./deploy @
bash: [[: @: syntax error in expression (error token is "@")
John Kugelman
  • 349,597
  • 67
  • 533
  • 578