Hi Ronny,
On Wed, Jan 18, 2012 at 18:42:53 +0100, Ronny Seffner wrote:
LEFT="yes" RIGHT=""
if [ $LEFT = "yes" ] && [ -z $RIGHT ]; then ...
allerdings wirft das den Fehler:
-bash: [: =: Einstelliger (unärer) Operator erwartet.
Was habe ich nicht verstanden?
Du solltest in beiden Tests die Variablenexpansion quoten, damit dort jeweils ein Argument rauskommt. Also: if [ "$LEFT" = "yes" ] && [ -z "$RIGHT" ]; ...
Sonst bekommst Du folgende Probleme:
1.
LEFT="" if [ $LEFT = "yes" ] && [ -z $RIGHT ]; ...
[: =: unary operator expected
Hier expandiert $LEFT zu _nichts_, also noch nicht mal zu einem leeren Argument. Deshalb beschwert sich das test-Kommando ([), dass bei einer Folge von Operator (=) und Operand ("yes") der Operator ein unaerer sein muss. Der Gleichheitsoperator ist aber ein binaerer (will zwei Argumente).
2.
LEFT="yes sir" if [ $LEFT = "yes" ] && [ -z $RIGHT ]; ...
[: too many arguments
Hier expandiert $LEFT zu yes sir, also zu zwei Argumenten. Das test-Kommando will nach einem Argument auf jeden Fall einen Operator als naechstes Argument sehen und keinen weiteren nicht-Operator.
3.
LEFT="yes" RIGHT="we can" if [ $LEFT = "yes" ] && [ -z $RIGHT ]; ...
[: we: binary operator expected
Die Shell expandiert $RIGHT zu we can, also wieder zwei Argumente. Hier haette ich eigentlich auch "too many arguments" erwartet :) Anscheinend zaehlt test alle Argumente und guckt sich dann den Operator an. Da -z ein unaerer Operator ist, passt ihm das nicht.
Uebrigens: Weder "[ ... ]" noch "&&" gehoeren zur Syntax von "if".
"[" ist ein eigenstaendiges Kommando und heisst eigentlich "test". Es prueft Bedingungen (Ausdruecke) und gibt das Ergebnis als Exit Status zurueck. Beispiele:
test a = a ([ a = a ] ist das Gleiche) echo $? (Exit Status 0, wahr) [ "bla" = "blubb" ] (ja, eckige Klammer auf ist ein Kommando, eckige Klammer zu wird in diesem Fall als Abschluss erwartet) echo $? (Exit Status 1, falsch)
"&&" ist ein Konstrukt zum Verketten von Kommandos. Das Kommando links von && wird ausgefuehrt. Wenn dessen Exit Status 0 ist, wird auch das Kommando rechts von && ausgefuehrt. Beispiel:
ping -c2 8.8.8.8 && echo "google dns is reachable"
"if" fuehrt das nachfolgende als Kommando aus und prueft den Exit Status. Ist dieser 0 (okay), wird der von "then" ... "fi" geklammerte Block ausgefuehrt. Beispiel:
if grep -wq swap /etc/fstab ; then echo "swap found in fstab" touch /var/log/swap_last_found fi
Gruss, Chris