expertenaustausch > comp.os.* > comp.os.unix.shell

Christian Beine (24.01.2005, 02:29)
Hallo.

Problem: Ein regulärer Ausdruck in einer if-Schleife.

Das Skript laesst eine Auswahl von 1-10 zu.
Alle anderen eingegebenen Zahlen,sollen auf die falsche Eingabe hinweisen.

echo "Eingabe: " ; read EINGABE
if [ ! $EINGABE -eq [1-10] ; then
echo "Falsche Einagabe."
else
echo "Ok."
fi

[1-10] ist so wohl falsch.
Ich habe schon mit Klammern,Anfuehrungszeichen und Slashes rumexperimentiert
und leider laeuft es nicht so,wie ich es gerne haette.

Bitte um Hilfe :)

Vielen Dank.

Christian
Alexander Bartolich (24.01.2005, 02:56)
begin followup to Christian Beine:
> Problem: Ein regulärer Ausdruck in einer if-Schleife.
> Das Skript laesst eine Auswahl von 1-10 zu.
> Alle anderen eingegebenen Zahlen,sollen auf die falsche Eingabe hinweisen.
> echo "Eingabe: " ; read EINGABE
> if [ ! $EINGABE -eq [1-10] ; then
> echo "Falsche Einagabe."
> else
> echo "Ok."
> fi


Degenerierter Schwachsinn.

Mit den eckigen Klammern rufst du das Programm »test« auf.
Der Operator »-eq« hat dabei folgende Bedeutung:

man test
# INTEGER1 -eq INTEGER2
# INTEGER1 is equal to INTEGER2

Die Lösung mit »test« sieht in etwas so aus:

if [ "$EINGABE" -lt 1 -o "$EINGABE" -gt 10 ] ; then

Allerdings versagt das furchtbar, wenn der Benutzer Buchstaben statt
Ziffern eingibt. Ein robustes Programm wird um eine weitere Überprüfung
nicht auskommen. Das könnte so aussehen:

if echo "$EINGABE" | grep -v '[0-9]' > /dev/null; then
echo "Ungültige Zeichen in der Eingabe"
elif [ "$EINGABE" -lt 1 -o "$EINGABE" -gt 10 ] ; then

In Sonderfällen lohnt es sich aber auch, das wirklich in einem einzigen
regulären Ausdruck abzufragen.

if echo "$EINGABE" | egrep '^([1-9]|10)$' > /dev/null; then
echo "Ok."
else
echo "Falsche Einagabe."
fi

> [1-10] ist so wohl falsch.
> Ich habe schon mit Klammern,Anfuehrungszeichen und Slashes rumexperimentiert
> und leider laeuft es nicht so,wie ich es gerne haette.


If all else fails, read the manual.
Stefan Wiens (24.01.2005, 05:21)
* Christian Beine schrieb:

> Das Skript laesst eine Auswahl von 1-10 zu.
> Alle anderen eingegebenen Zahlen,sollen auf die falsche Eingabe hinweisen.
> echo "Eingabe: " ; read EINGABE
> if [ ! $EINGABE -eq [1-10] ; then
> echo "Falsche Einagabe."
> else
> echo "Ok."
> fi
> [1-10] ist so wohl falsch.


Und das aus mehreren Gründen: [1-10] wird von der Shell zu "1" und "0"
expandiert, falls Dateien mit diesen Namen existieren, zu "[" fehlt
das schließende "]", das ungequotete $EINGABE kann zu keinem oder zu
mehreren Argumenten expandieren, kann nichtnumerisch sein oder
außerhalb des zulässigen Bereichs liegen, und der "-eq"-Operator von
test ("[") funktioniert anders.

Mein Vorschlag:

case "$EINGABE" in
[1-9]|10) echo Ok.
;;
*) echo "Falsche Eingabe."
;;
esac
Stefan Wiens (24.01.2005, 06:28)
* Alexander Bartolich schrieb:

> Allerdings versagt das furchtbar, wenn der Benutzer Buchstaben statt
> Ziffern eingibt. Ein robustes Programm wird um eine weitere Überprüfung
> nicht auskommen. Das könnte so aussehen:
> if echo "$EINGABE" | grep -v '[0-9]' > /dev/null; then
> echo "Ungültige Zeichen in der Eingabe"


Das läßt z. B. "e4" durch; außerdem ist grep hier Overkill.
[ ! "${EINGABE%%*[!0-9]*}" ] oder [ "${EINGABE%[0-9][0-9]}" ]
würden genügen.

> elif [ "$EINGABE" -lt 1 -o "$EINGABE" -gt 10 ] ; then


Das läßt sich noch immer überlisten. Man sollte entweder auf eine
vernünftige Ziffernzahl prüfen (s. o.) oder das [-Kommando so umbauen,
daß es nur bei "guter" Eingabe true ergibt, z. B.

elif ! [ "$EINGABE" -ge 1 -a "$EINGABE" -le 10 ] ; then
echo "Falsche Eingabe."
Thomas 'PointedEars' Lahn (24.01.2005, 09:33)
Christian Beine wrote:

> [...]
> Problem: Ein regulärer Ausdruck in einer if-Schleife.


<http://google.de/search?q=if-Schleife&filter=0>

Aaargh! Nochmal für alle Scriptkiddies zum Mitmeißeln:

*Es* *gibt* *keine* "if-Schleife"!

`if' bewirkt in allen Programmiersprachen, die ich kenne, darunter
(ba)sh, eine *Fallunterscheidung*. Da schleift genau gar nichts
(d.h. Anweisungen werden _nicht_ wiederholt [das tut höchstens eine
umgebende Schleife; in Shell-script z.B. eine while..do..done oder
for...do..done-Schleife]).

kopfschüttelnd,
PointedEars
Marta Pfahl (24.01.2005, 11:06)
case waere wohl besser

echo "Eingabe: " ; read EINGABE
case $EINGABE in
1|2|3|4|5|6|7|8|9|10) echo ok ;;
*) echo falsch ;;
esac

help case
case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
Selectively execute COMMANDS based upon WORD matching PATTERN. The
`|' is used to separate multiple patterns.

On Mon, 24 Jan 2005 01:29:55 +0100
Christian Beine <yelw0rc> wrote:
[..]
Thomas 'PointedEars' Lahn (24.01.2005, 11:39)
Marta Pfahl wrote:
^^^^^^^^^^^
Ist das Dein richtiger Name?

> case waere wohl besser
> echo "Eingabe: " ; read EINGABE
> case $EINGABE in
> 1|2|3|4|5|6|7|8|9|10) echo ok ;;
> *) echo falsch ;;
> esac
> help case
> case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
> Selectively execute COMMANDS based upon WORD matching PATTERN. The
> `|' is used to separate multiple patterns.


$ mansh case[1]
[...]
| A case command first expands word, and tries to match it against
| each pattern in turn, using the same matching rules as for path-
| name expansion (see Pathname Expansion below).
^^^^^^^^^^^^^^^^^^
Daher:

echo "Eingabe: "; read EINGABE
case $EINGABE in
[1-9]|10) echo ok;;
*) echo falsch;;
esac

> [TOFU: Text Oben, Fullquote Unten]


<http://learn.to/quote>

PointedEars
___________
[1] Eigenes Script für schnellen Lookup von Shellbefehlen, siehe Google.
Christian Beine (24.01.2005, 12:41)
Thomas 'PointedEars' Lahn wrote:

> Christian Beine wrote:
>> [...]
>> Problem: Ein regulärer Ausdruck in einer if-Schleife.

> <http://google.de/search?q=if-Schleife&filter=0>
> Aaargh! Nochmal für alle Scriptkiddies zum Mitmeißeln:
> *Es* *gibt* *keine* "if-Schleife"!


Ack. Ok. Verzeihung. if-Abfrage :)
[..]
Christian Beine (24.01.2005, 15:26)
Alexander Bartolich wrote:

> begin followup to Christian Beine:
> Degenerierter Schwachsinn.


Das wollte ich doch schon immer hoeren.
[..]
Ähnliche Themen