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
--
Christian Perle chris AT linuxinfotag.de
010111 http://chris.silmor.de/
101010 LinuxGuitarKitesBicyclesBeerPizzaRaytracing
_______________________________________________
Lug-dd maillist - [email protected]
https://ssl.schlittermann.de/mailman/listinfo/lug-dd