2012-03-27 11 views
1

Ich habe dieses Stück Code:

if(("$op" == "q")); then 

, die diesen Fehler wirft:

l5p3.sh: line 10: ((: + == q: syntax error: operand expected (error token is "== q") 

Was ist das Problem? Wie vergleicht man $ op mit dem Buchstaben $ q?

+1

tun in Ihrem Abstand beim Schreiben von Shell-Skripten: 'if [" $ op "=" q "]' wird funktionieren, während 'if [$ op = q]' nicht funktioniert. –

Antwort

5

((...)) (für arithmetische Ausdrücke) ist wahrscheinlich nicht das, was Sie wollen. Überprüfen Sie folgendes:

if (("asd" == "bla")); then 
    echo test 
else 
    echo bah 
fi 

Er druckt test in Bash und ein Fehler in einem streng bourne-kompatible Shell wie dash.

Versuchen Sie Folgendes statt:

if [[ $op == q ]]; then 
+0

warum nicht ((und))? So arbeitete ich vorher, mit ((und)) und es funktionierte gut – FinalDestiny

+0

@FinalDestiny '((' und '))' sind für mathematische Operationen. Sie wollen '[' 'und']] 'oder' ['und'] '(die ziemlich verschieden sind - und ersteres ist normalerweise besser) zum Vergleichen von Strings. –

+0

@NiklasB. '(($ op == q))' würde tatsächlich Déferenzierung von '$ q' sein und nach einer Zahl suchen; Es ist eine ganz andere Sache als '[[$ op = q]]' '. (Quotes werden nicht auf der linken Seite eines '[['] Ausdruck benötigt, im Gegensatz zu einem '[' ', und sie werden nur auf der rechten Seite benötigt, wenn dieser Wert als glob Muster interpretiert werden könnte) . –

1

Für Stringvergleichen Sie doppelte eckige Klammern nicht Klammer verwenden möchten. Das richtige zu schreiben wäre:

if [[ "$op" == "q" ]]; then 

Doppelklammer werden für arithmetische nicht boolesche Ausdrücke verwendet. Siehe http://tldp.org/LDP/abs/html/dblparens.html

+0

JA! FUNKTIONIERT! Danke. – FinalDestiny

0

Versuchen Sie, diese zu ändern, Räume zwischen den [] sind wirklich wichtig:

op="q" 
if [ "$op" == "q" ]; then 
    echo "hi" 
fi 
0

oder Sie können durch die Art und Weise, sein liberaler In der Regel, wie diese

if test "$op" = "q" ; then 
    echo 'hi' 
fi