Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
shell: Vergleich eines Wertes mit dem einer Liste

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
rossi
Gast





BeitragVerfasst am: 26. Jun 2002 20:50   Titel: shell: Vergleich eines Wertes mit dem einer Liste

Hallo,

ich würde gerne überprüfen, ob ein Wert identisch mit einem anderen einer Liste ist.
Hab erfloglos folgendes versucht:

-----
#!/bin/sh

ARG="eine kuh macht muh"

if ${1} in ${ARG}; then
echo 'Alles im Lot'
else
echo 'Alternativen bitte !'
fi

------

Ich würde hier gerne testen, ob das erste dem Skript übergebene Argument ($1) mit einem der Worte in $ARG übereinstimmt. Wenn also $1 entweder "eine" oder "kuh" oder "macht" oder "muh" ist, soll der Text "alles im Lot" ausgegeben werden. Anderenfalls halt die Bitte nach den Alternativen. Sorry für die Auschweifung, aber ich wußte mangels Fachjargon nicht, das besser zu beschreiben.

Nun täte ungerne hierfür eine "case" Anweisung basteln, weil die Argumentliste variabel sein wird und erst mit Skriptaufruf erstellt wird. Und ich denke (hoffe), es geht auch eleganter als mit einer "for" Schleife.
Und wie immer, ziehe ich "sh" der "bash" vor. Einfach wegen der sauberen Grundschule.
 

Chris
Gast





BeitragVerfasst am: 26. Jun 2002 22:23   Titel: Re: shell: Vergleich eines Wertes mit dem einer Liste

Hi Rossi!

Klar geht's einfacher...

code:

#!/bin/sh

ARG="eine kuh macht muh"

echo $ARG | grep -q $1
[ $? -eq 0 ] && echo 'Alles im Lot' || echo 'Alternativen bitte !'




Gruß
Chris
 

rossi
Gast





BeitragVerfasst am: 26. Jun 2002 23:16   Titel: Re: shell: Vergleich eines Wertes mit dem einer Liste

Autsch. Hätte man fast noch selber drauf kommen können. Hab schon wieder wirre Befehlsinterpretationen gesucht Wink Auf jeden Fall vielen Dank.

Noch eine Frage zu der "[ args ] $$ do" Notation.

Kann ich auch bei Erfüllung zwei Befehle ausführen oder muß ich dann zu "if" greifen, quasi:

[ a != b ] && echo "Falsch"; exit 1 || echo "Richtig"

Haut so nicht hin, klar, aber kann ich der sh zwei Befehle als einen vorkaukeln ? "if" sieht so häßlich aus bei nur zwei Zeilen ... und macht dat Ding unnötig (?) größer und vor allem unübersichtlicher.
 

Jochen
Gast





BeitragVerfasst am: 27. Jun 2002 7:45   Titel: Re: shell: Vergleich eines Wertes mit dem einer Liste

@Chris:

Lange und teils schmerzhafte Erfahrung mit Regulären Ausdrücken hat mich gelehrt, diese sehr vorsichtig zu formulieren; daher hätte ich noch einen Verbesserungsvorschlag zu Deiner grep-Zeile.
echo "$ARG" | grep  '\<'"$1"'\>' >/dev/null 2>&1
So geht die Shell einmal nicht an den Inhalt der Variablen dran und ändert ihn eigenmächtig, und grep sucht nach ganzen Wörtern in der Argumentliste, denn sonst würde beispielsweise ein "u" als Argument auch passen. Die Option "-q" zu grep ist praktisch, nach meiner Erfahrung aber leider nicht sehr portabel; daher verwende ich lieber die "althergebrachte" Methode der Umlenkung nach /dev/null.

Nächster Punkt: Explizit "$?" mit test zu verwenden ist meist doppelt gemoppelt: Wenn man schon eine Exit-Code hat, kann man auch direkt auf ihn reagieren und nicht erst den Exit-Code verwenden, um genau den gleichen durch test reproduzieren zu lassen. Die Schreibweise wäre dann
code:

echo "$ARG" | grep '\<'"$1"'\>' >/dev/null 2>&1 && echo "Alles im Lot" || echo "Alternativen bitte"



@rossi:
Über das Aussehen des "if"s lässt sich streiten, ich persönlich mag die ausführliche Variante lieber. Vor allem, wenn man tatsächlich mehrere Kommandos in so einem Konstrukt gruppiert:
echo "$ARG" | grep '\<'"$1"'\>' >/dev/null 2>&1 && { echo "Alles im Lot"; exit 0 ; } || { echo "Alternativen bitte"; exit 1 ; }
Ganz schön unübersichtlich, ne? Zur Theorie: Kommandos kannst Du in der Shell auf zwei Arten gruppieren, und zwar mittels runder Klammern und geschweifter Klammern. Bei runden Klammern werden die Kommandos in einer Subshell ausgeführt, also ein eigener Prozess dazu verwendet. Bei geschweiften Klammern werden die Kommandos in der laufenden Shell selbst ausgeführt. Achte genau auf die Syntax:
{ cmd1 ; cmd2 ; }
Die Klammerung muss mit "; }" enden!

(Das ist alles übrigens reine Bourne-Shell und damit auch ziemlich portabel.)

Jochen
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy