¿Cuál es la diferencia entre el operador “=” y “==” en Bash?

Parece que estos dos operadores son prácticamente iguales, ¿hay alguna diferencia? ¿Cuándo debería usar = y cuándo == ?

Debe usar == en comparaciones numéricas en (( ... )) :

 $ if (( 3 == 3 )); then echo "yes"; fi yes $ if (( 3 = 3 )); then echo "yes"; fi bash: ((: 3 = 3 : attempted assignment to non-variable (error token is "= 3 ") 

Puede usar las comparaciones de cadenas en [[ ... ]] o [ ... ] o la test :

 $ if [[ 3 == 3 ]]; then echo "yes"; fi yes $ if [[ 3 = 3 ]]; then echo "yes"; fi yes $ if [ 3 == 3 ]; then echo "yes"; fi yes $ if [ 3 = 3 ]; then echo "yes"; fi yes $ if test 3 == 3; then echo "yes"; fi yes $ if test 3 = 3; then echo "yes"; fi yes 

“¿Comparaciones de cadenas?”, ¿Dices?

 $ if [[ 10 < 2 ]]; then echo "yes"; fi # string comparison yes $ if (( 10 < 2 )); then echo "yes"; else echo "no"; fi # numeric comparison no $ if [[ 10 -lt 2 ]]; then echo "yes"; else echo "no"; fi # numeric comparison no 

Hay una diferencia sutil con respecto a POSIX. Extracto de la referencia de Bash :

string1 == string2
Verdadero si las cadenas son iguales. = puede usarse en lugar de == para una estricta conformidad POSIX.