2010-04-08 12 views

Odpowiedz

71

Musisz użyć == porównań numerycznych w ((...)):

$ 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 ") 

można używać zarówno do porównań łańcuchowych w [[ ... ]] lub [ ... ] lub 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 

"porównań ciąg?" mówisz?

$ 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 
+3

Nie powinieneś używać '==' z '[' lub 'test', chociaż. '==' nie jest częścią specyfikacji POSIX i nie będzie działać ze wszystkimi powłokami (w szczególności 'dash' nie rozpoznaje go). – chepner

+3

@chepner: To prawda, ale pytanie dotyczy właśnie Bash. –

29

Istnieje subtelna różnica w odniesieniu do POSIX. Wyciąg z Bash reference:

string1 == string2
Prawda, jeśli słowa są równe. = może być używany zamiast ==, aby zachować zgodność z wymaganiami POSIX.

+0

Nie ma różnicy w bashach? Tylko kwestia przenośności? –

+0

@ T.E.D .: Nie, zobacz moją odpowiedź. –

Powiązane problemy