vermutliches Klammern- und Tick-Problem

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

vermutliches Klammern- und Tick-Problem

Beitrag von MoonKid » 09.02.2013 15:28:40

Wahrscheinlich bringe ich hier mal wieder was mit den Anführungszeichen, Ticks usw durcheinander.

An dem grep scheint ihn was zu stören. Hab schon einges probiert, aber das bringt ja auch nix, ohne zu wissen was man tut. Auch backticks funktionieren bei dem grep nicht und machen nach meinem Verständnis auch keinen Sinn.

Code: Alles auswählen

root@pc-kubuntu:/usr/local/bin/buhtzyparanoid# cat test.sh
#!/bin/bash

bp_is_nas_there () {
        if [ $(ping $1 -q -c 1 | grep '"1 received"' | wc -l) -eq 1]; then
                exit 0
        fi

exit 1
}

if [ $(bp_is_nas_there MY_NAS) -eq 1 ]; then
        echo nas_is_there
fi

root@pc-kubuntu:/usr/local/bin/buhtzyparanoid# ./test.sh
ping: unknown host MY_NAS
./test.sh: Zeile 4: [: Fehlende `]'
./test.sh: Zeile 11: [: -eq: Einstelliger (unärer) Operator erwartet.

Benutzeravatar
4A4B
Beiträge: 975
Registriert: 09.11.2011 11:19:55
Kontaktdaten:

Re: vermutliches Klammern- und Tick-Problem

Beitrag von 4A4B » 09.02.2013 16:37:29

Da fehlt noch ein Leerzeichen zwischen "1" und dem schließenden "]":

Code: Alles auswählen

       if [ $(ping $1 -q -c 1 | grep '"1 received"' | wc -l) -eq 1]; then

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: vermutliches Klammern- und Tick-Problem

Beitrag von Cae » 09.02.2013 16:53:57

Das schliessende ] vom test in der ersten Zeile von bp_is_nas_there() hat keinen Whitespace zur 1 davor. test sieht also -eq als zweites und 1] als drittes Argument, anstatt -eq, 1, ].

Uebrigens ist die Abfrage nach Rueckgabewerten kaputt, die werden nicht rausge-echo-t, das geht anders [1]:

Code: Alles auswählen

$ foo() { return 0; }
$ if foo; then echo 0; else echo 1; fi
0
$ foo() { exit 1; }
$ if foo; then echo 0; else echo 1; fi
** Shell beendet mit ret=1 **
Du willst also return anstatt exit verwenden und das zweite test-Konstrukt entfernen.

Gruss Cae

[1] ja, natuerlich kann man die ifs auch weglassen und hat mit foo; echo $? denselben Output. Mir ging's aber gerade um die Demonstration von if mit Funktionen.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

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

Re: vermutliches Klammern- und Tick-Problem

Beitrag von MoonKid » 09.02.2013 19:13:31

Mhm... Danke so hauts hin.

Da taucth ein neues Problem auf. test (vermutlich) hat zuviele Argumente. Aber ich verstehe nicht wieso. Für mich sieht der Aufruf ok aus.

Code: Alles auswählen

#!/bin/bash

bp_is_nas_there () {
        if [ $(ping $1 -q -c 1 | grep "1 received" | wc -l) -eq 1 ]; then
                echo 1
        else
                echo 0
        fi

echo 0
}

if [ $(bp_is_nas_there SPARKY) -eq 1 ]; then
        echo nas_is_there
fi

root@pc-kubuntu:/usr/local/bin/buhtzyparanoid# ./test2.sh
./test2.sh: Zeile 13: [: Zu viele Argumente.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: vermutliches Klammern- und Tick-Problem

Beitrag von Cae » 09.02.2013 19:19:22

Naja, deine Funktion schreibt nun abhaengig vom Ergebnis

Code: Alles auswählen

1|0
0
auf stdout und das sind zwei whitespacegetrennte Werte. Damit hast du zuviele Argumente, was zu besagter Meldung fuehrt.

Wie man Funktionen korrekt verwendet, habe ich ja oben schon geschrieben.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

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

Re: vermutliches Klammern- und Tick-Problem

Beitrag von MoonKid » 09.02.2013 20:06:20

Ah, er kummuliert, was auf stdout liegt.

Aber irgendwas kommt da immer noch falsch zurück.

Code: Alles auswählen

#!/bin/bash

bp_is_nas_there () {
        if [ 1 -eq 1 ]; then
                return 1
        fi

return 0
}

if [ $(bp_is_nas_there SPARKY) -eq 1 ]; then
        echo nas_is_there
fi

root@pc-kubuntu:/usr/local/bin/buhtzyparanoid# ./test2.sh
./test2.sh: Zeile 11: [: -eq: Einstelliger (unärer) Operator erwartet.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: vermutliches Klammern- und Tick-Problem

Beitrag von Cae » 09.02.2013 20:20:23

Genau. Da du jetzt nicht mehr ueber magische echos kommunizierst, sondern ueber Rueckgabewerte, solltest du unten auch auf den Rueckgabewert schauen, d.h.:

Code: Alles auswählen

if [ $(bp_is_nas_there SPARKY) -eq 1 ]; then # durch
if bp_is_nas_there SPARKY; then
ersetzen.

Wenn die Funktion mehrere Rueckgabewerte haben kann, ist so ein Konstrukt angebracht:

Code: Alles auswählen

bp_is_nas_there SPARKY
case "$?" in
	0)
		echo success
		;;
	1)
		echo fail
		;;
	2)
		echo almost failed
		;;
	*)
		echo wtf
		;;
esac
Wichtig ist, dass zwischen der Abfrage von $? in case und dem zugehoerigen Befehl (hier bp_is_nas_there()) keine weiterer Befehl liegt, weil sonst dessen Rueckgabewert in $? landet.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten