ubuntuusers.de

Bash: Zu viele Argumente; if

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

jakon Team-Icon

Lokalisierungsteam

Anmeldungsdatum:
16. November 2009

Beiträge: 419

Hallo!

Ich habe ein Bash-Script geschrieben, das mir, wenn die Maus eingesteckt ist, sagt, dass sie eingesteckt ist, und wenn nicht, dann sagt es mir, dass es nicht eingesteckt ist. Tut es aber nicht 😈

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

var=$(lsusb | grep "Mouse")

if [ -n $var ]
then
        echo 'Die Maus ist eingesteckt.'
else
        echo 'Die Maus ist nicht eingesteckt.'
fi

Wenn die Maus eingesteckt ist, bekomme ich immer diese Ausgabe:

./mouse_touchpad.sh: Zeile 5: [: Zu viele Argumente.

Die Maus ist nicht eingesteckt.

Und wenn sie nicht eingesteckt ist:

Die Maus ist eingesteckt.

Woran liegt das? -n steht ja für »nicht leerer String« und das trifft ja zu, wenn die Maus eingesteckt ist, und nicht wenn sie nicht eingesteckt ist.

Viele Grüße,

Jakob.

paddel

Avatar von paddel

Anmeldungsdatum:
30. Dezember 2007

Beiträge: 152

Hi,

setz mal $var in Anführungszeichen.

if [ -n "$var" ]

The-Compiler Team-Icon

Avatar von The-Compiler

Anmeldungsdatum:
21. April 2006

Beiträge: 2640

Wohnort: Winterthur, Schweiz

Hallo,

das "Problem" kannst du noch viel einfacher lösen! Nach if kann in Bash irgend ein Kommando kommen, dessen Rückgabewert überprüft wird. Und netterweise gibt grep 0 ("wahr") zurück, wenn etwas gefunden wurde, und sonst 1 ("falsch").

1
2
3
4
5
6
if lsusb | grep -q "Mouse"
then
        echo 'Die Maus ist eingesteckt.'
else
        echo 'Die Maus ist nicht eingesteckt.'
fi

Die -q Option steht für --quiet und sagt grep, es solle nichts ausgeben.

Flo

jakon Team-Icon

Lokalisierungsteam
(Themenstarter)

Anmeldungsdatum:
16. November 2009

Beiträge: 419

The Compiler schrieb:

Hallo,

das "Problem" kannst du noch viel einfacher lösen! Nach if kann in Bash irgend ein Kommando kommen, dessen Rückgabewert überprüft wird. Und netterweise gibt grep 0 ("wahr") zurück, wenn etwas gefunden wurde, und sonst 1 ("falsch").

1
2
3
4
5
6
if lsusb | grep -q "Mouse"
then
        echo 'Die Maus ist eingesteckt.'
else
        echo 'Die Maus ist nicht eingesteckt.'
fi

Die -q Option steht für --quiet und sagt grep, es solle nichts ausgeben.

Flo

Danke, Flo! Das Bash-Scripting-Tutorial im Wiki ist halt nicht vollständig 😀 Interessant, dass grep einen Rückgabewert hat, den man gar nicht sieht. Gut, danke danke! ☺

kustom

Anmeldungsdatum:
18. März 2008

Beiträge: 41

Wohnort: Nürnberg

Ich habe mir die PS1-Variable so angepasst das Rückgabewerte != 0 ausgegeben werden. Einfach folgendes in die .bashrc einfügen:

PS1error='$(ret=$?; test $ret -gt 0 && echo "\[\e[0;31m\][$ret] \[\e[0m\]")'
PS1="\[\033[0m\]\n\[\033[1;34m\]\u\[\033[0m\] \w\n$PS1error>> "

Bei Bedarf einfach noch an eigene Bedürfnisse anpassen und schon sieht man was die Programme so melden.

adun Team-Icon

Avatar von adun

Anmeldungsdatum:
29. März 2005

Beiträge: 8606

Ist nebenbei mal wieder eine der vielen bescheuerten sh Fallstricke. Um das Problem zu umschiffen macht man praktisch folgendes um "leere Variablen" zu überprüfen:

1
if [ "x$var" = "x" ] ; then

Chu-I

Avatar von Chu-I

Anmeldungsdatum:
10. März 2006

Beiträge: 50

Wohnort: Berlin

Ich weiß der Thread ist alt aber da ich gerade was anderes suche bin ich hierauf gestoßen und kann nicht anders ... 😉 Ich bin mir sehr sicher das die bash auch schon 2010 folgendes konnte und somit dein workaround überflüssig ist.

1
if [ -z "$var" ]; then

Es gibt sicherlich einiges über die bash zu schimpfen aber das wohl kaum. ☺

Antworten |