This post is aimed at helping people write more pedantically correct shell scripts, which I believe is one of life's most noble goals.
This is the correct way to test if two strings are equal in sh or bash using [
:
if [ "$foo" = "$bar" ]
Note that there is only one equals sign. This is documented for the Bash test
builtin if you type help test
(note that
[
if just a weird alias for test
). This is also documented in the online Bash manual.
This is also documented in the
man page for
/usr/bin/test
. This is how string checking has worked in the shell since the
original versions of Unix.
This is the correct way to test if two strings are equal in bash using [[
:
if [[ "$foo" == "$bar" ]]
Note that there are two equals signs. This is more similar syntax to almost
every other procedural programming language, since most of them use ==
to test
for equality.
It turns out that a lot of people are confused by this whole thing. Those people
sometimes end up using the ==
syntax with the [
operator. The bash authors
decided to deviate from the traditional behavior of /bin/sh
and support this
syntax. So if you do this:
if [ "$foo" == "$bar" ]
then this program will run in bash and do a string equality check. However, this
is not documented, and is also in contravention to how the original /bin/sh
works. So if you try to run this program under an implementation like the
Almquist shell, which Debian
installs as /bin/sh
as part of the dash
package, then you will get a syntax
error.
If you're interested in increasing the portability of your scripts and not relying on undocumented behavior I encourage you to use the correct syntax when checking string equality in your shell scripts.