:: too many arguments

tzzaetaynzz

tzzaetaynzz

Tripel-As
Hallo zusammen,

beim ausführen eines Skriptes erhalte ich folgenden Fehler:/pfad/skriptname: line 19: [: too many arguments

Hier das Skript:

19 if [ $MESSAGE == "Build Failed" ]
20 then
21 cat /tmp/$1.log | /bin/mailx -s "$MESSAGE" logintest
22 fi


Wenn ich der Zeile 19 die if-Abfrage ändere funktioniert das Skript fehlerfrei.

Hier das abgeänderte Skript:

19 if [[ $MESSAGE == "Build Failed" ]]
20 then
21 cat /tmp/$1.log | /bin/mailx -s "$MESSAGE" logintest
22 fi


Warum ist das so, warum ist [[]] besser als []?
 
So:
Code:
#!/bin/bash
if[ "$MUH" == "MAEH" ]; then
   echo "lala";
else
   echo "lulu";
fi
Du vergleichst ja eine Variable mit einem String. Also muss die Variable auch in ".
 
test(1) verwendet nur ein Gleichheitszeichen zum Vergleichen von Strings und nicht zwei. Also:
Code:
if [ "$var" = "abc" ]; then
    echo "equal"
fi

Die Anführungszeichen sind hier nicht unbedingt nötig, man sollte Variablen aber immer quoten (Leerzeichen).
 
Danke für Eure antworten.

Ich sehe, das vergleichen von (String)Variablen soll mit quotes erfolgen
und mit einem Gleichheitszeichen (nicht wie bei mir mit zwei).

Aber was hat das mit [[]] und [] zu schaffen?
 
Code:
 [ ]
ist ne Art Kurzform für
Code:
test
, was zwei Werte miteinander vergleicht. Mit
Code:
 [[ ]]
wendest du test ja quasi auf sich selbst an.... Also ist
Code:
[[ ]]
nicht besser sondern wertet nur das Ergebnis des ersten [] aus ;)

Mit 2 Gleichheitszeichen funktioniert's aber auch....
 
Hi,

Mit
Code:
 [[ ]]
wendest du test ja quasi auf sich selbst an.... Also ist
Code:
[[ ]]
nicht besser sondern wertet nur das Ergebnis des ersten [] aus ;)
Nein. So wie du das meinst, muesstest du noch ein Leerzeichen zwischen die Klammern packen, was in den meisten Faellen aber auch zu Syntax Fehlern fuehren duerfte.
Mit 2 Gleichheitszeichen funktioniert's aber auch....
Ja und Nein, je nachdem ob '[' oder '[[' verwendet wird. Zur naeheren Erlaeuterung siehe den Link von Tblue oder auch 'man bash'. ;)

mfg,
bytepool
 
Ja, ich hab mich schon in die Ecke gestellt, nachdem ich's nachgelesen hatte ;)
 
Danke für Eure postings.

Im "Bash Cook Book" lese ich, die [[]] sind mit der Bash 2.01 eingeführt worden. Der Syntax innerhalb der Klammern ist gleich, aber die Auswertund ist anders ... so ganz habe ich es nicht verstanden.
 
Hi,

Ja, ich hab mich schon in die Ecke gestellt, nachdem ich's nachgelesen hatte ;)

mach dir nix draus, sim's Code und Erklaerungen sind genauso schlimm, das seh' ich jetzt erst. ;)

Aber ich schreibe diesen Post auch nicht um euch weiter zu bash'en, sondern um noch kurz hinzuzufuegen, dass man sich am besten auch noch gegen den Sonderfall von leeren Variablen absichern sollte. Entweder, indem man die benutzten Variablen vorher mit -z auf Nullstrings testet, oder mit dem kleinen Hack, dass man auf beiden Seiten des Stringvergleichs noch einen Buchstaben anhaengt:
Code:
if [ a"$var" = a"foo" ]; then [...]
Tut man das nicht, fuehrt das zum Abbruch des Skripts wegen Syntax Fehlern, sollten die Variablen tatsaechlich mal leer sein.

mfg,
bytepool
 
Zuletzt bearbeitet:

Ähnliche Themen

[gelöst] - for file in ... nur für bestimmte Endungen?

Crontab und Scripts - Problem

HandbrakeCLI Shell Skript

Port generieren, wenn nicht dann

skript zum löschen doppelter dateien

Zurück
Oben