[bash] if, Operatoren und Leerzeichen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

[bash] if, Operatoren und Leerzeichen

Beitrag von MoonKid » 13.03.2012 13:39:06

Code: Alles auswählen

if [ ${bp_size_log_error}=='0' ]
then
   rm ${bp_log_error}
fi
Ihr seht das vor und nach '==' keine Leerzeichen sind.
Würde ich da welche hinmachen meckert die bash und sagt:
./bp/buhtzyparanoid.sh: Zeile 102: [: ==: Einstelliger (unärer) Operator erwartet.
Ohne Leerzeichen ist das so unleserlich. Ist es tatsächlich so, dass ich hier keine hinmachen darf, oder liegt der Fehler woanders?

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von Liffi » 13.03.2012 13:46:13

MoonKid hat geschrieben:

Code: Alles auswählen

if [ ${bp_size_log_error}=='0' ]
then
   rm ${bp_log_error}
fi
Versuch mal nur ein '='.
EDIT:: Und statt '0' "0".

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von MoonKid » 13.03.2012 14:21:53

Bist du sicher das ein = ein Vergleich und keine Zuweisung ist?

Er bleibt bei seinem Fehler.

Code: Alles auswählen

if [ ${bp_size_log_error} = "0" ]
./bp/buhtzyparanoid.sh: Zeile 100: [: =: Einstelliger (unärer) Operator erwartet.

DeletedUserReAsG

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von DeletedUserReAsG » 13.03.2012 14:27:23

Code: Alles auswählen

if (( $var == 1 )) … 
Die beiden Standardmanuals (Beginners Guide und Advanced Bash Scripting, beide auf tldp zu finden) sind eine gute Anlaufstelle, btw.

cu,
niemand

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von Liffi » 13.03.2012 14:46:48

MoonKid hat geschrieben:Bist du sicher das ein = ein Vergleich und keine Zuweisung ist?
Zum Vergleich wird nur in 'normalen' Programmiersprachen == benutzt. Die Bourne Shell hatte urspruenglich einfache Gleichheitszeichen. Die Bash akzeptiert vermutlich aber auch doppelte.

Code: Alles auswählen

if [ ${bp_size_log_error} = "0" ]
./bp/buhtzyparanoid.sh: Zeile 100: [: =: Einstelliger (unärer) Operator erwartet.
Genau diese Zeile funktioniert bei mir.
Funktioniert bei dir ein

Code: Alles auswählen

s="1" && if [ ${s} = "1" ]; then echo "hurray"; fi
?

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von MoonKid » 13.03.2012 15:04:58

-eq wars, dann gehts auch mit Leerzeichen.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von Liffi » 13.03.2012 15:08:16

MoonKid hat geschrieben:-eq wars, dann gehts auch mit Leerzeichen.
-eq ist aber nur fuer Zahlen vorgesehen. Du hast aber vorhin String verglichen...

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von MoonKid » 13.03.2012 15:42:05

Ne das war es doch nicht. Immer noch der Fehler.

Nochmal vereinfacht

Code: Alles auswählen

#!/bin/bash

s=100

if [ $size -eq 0 ]; then
  echo me
fi
Ich steig nicht dahinter, was er mir mit dem Operator sagen möchte.

Im übrigen hatte ich im Beispiel vorher auch das ; vergessen. Scheint aber nicht das Problem gewesen zu sein.

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von JaKlaRo » 13.03.2012 17:26:28

Hallo,
ich kenne das Problem, die Lösung sind doppelte Klammern.

Code: Alles auswählen

#!/bin/bash

s=100

if [[ $size -eq 0 ]]; then
  echo me
fi
Gruß
JaKlaRo

qgirl
Beiträge: 224
Registriert: 14.08.2005 09:04:50
Lizenz eigener Beiträge: MIT Lizenz

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von qgirl » 13.03.2012 20:19:03

Code: Alles auswählen

    #!/bin/bash

    s=100

    if [ $size -eq 0 ]; then
      echo me
    fi
$size ist in dem Beispiel kein Wert zugewiesen. Mit [ $s -eq 0 ] dürfte die Meldung eigentlich nicht mehr kommen.

Gruss
qgirl

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von Meillo » 13.03.2012 20:51:09

MoonKid hat geschrieben:
./bp/buhtzyparanoid.sh: Zeile 100: [: =: Einstelliger (unärer) Operator erwartet.
Wenn man verstanden hat, dass die Shell nur Textersatz macht, dann ist die Meldung klar.

Code: Alles auswählen

if [ $size -eq 0 ]; then
Hier wird `$size' ersetzt durch seinen Wert. In deinem Fall ist die Variable undefiniert, somit ist ihr Wert leer. Die Shell macht also folgendes daraus:

Code: Alles auswählen

if [  -eq 0 ]; then
Dadurch geht dem *binaeren* Operator `-eq' der linke Operand verloren. Die Shell beklagt sich, dass ohne linken Operand nur ein unaerer Operator Sinn macht. Sie haette genausogut sagen koennen, dass ihr fuer den binaeren Operator `-eq' der linke Operand fehlt. Das waere die wohl sinnvollere Fehlermeldung gewesen.

Da die Shell nunmal nur Textersatz macht muss sich der User manuell um die Einheit von Woertern und um besondere Strings kuemmern.

Haettest du doppelte Anfuehrungszeichen genommen, dann waere aus

Code: Alles auswählen

if [ "$size" -eq 0 ]; then
mit leerem `size' Folgendes geworden

Code: Alles auswählen

if [ "" -eq 0 ]; then
Der linke Operand waere also nicht ``verschwunden''.

Ebenso, wenn ein Variablenwert Whitespace enthaelt und man laesst die Quotes weg, dann erkennt die Shell nach der Variablenexpansion dort mehrere Worte, statt einem mit Whitespace.

(Ganz anders ist das bei Perl, PHP und Co. Die ersetzen Variablen durch ihren Wert unter Aufrechterhaltung des lexikalischen Tokens.)


Faustregel: Indem man Double Quotes verwendet liegt man fast immer richtig.
Use ed once in a while!

yeti

Re: [bash] if, Operatoren und Leerzeichen

Beitrag von yeti » 14.03.2012 02:40:35

Wenn's eh klar ist daß man die böse Debianbash benutzt, warum dann nicht einfacher die Rechnerei und Vergleicherei in die Doppelklammer verbannen?

Code: Alles auswählen

$ size=100
$ if ((size)) ; then echo nicht null ; fi
nicht null
$ if ((size<200)) ; then echo kleiner ; fi
kleiner
$ if ((size>20)) ; then echo größer ; fi
größer
$ ((size*=2)) ; echo $size
200
$ if ((size==200)) ; then echo gotcha ; fi
gotcha
Just for fun nochwas Hintendran:

Code: Alles auswählen

((a=2)) ; while ((a<1<<11)) ; do if [ -n "${b[a]}" ] ; then ((c=${b[a]})) ; unset b[a] ; else ((c=a)) ; echo -n "$a " ; fi ; ((d=a+c)) ; while [ -n "${b[d]}" ] ; do ((d+=c)) ; done ; ((b[d]=c)) ; ((a++)) ; done ; echo

Antworten