snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Also ich lese etwas ein und bevor es an eine while-do-Schleife übergeben wird, soll getestet werden ob die Eingabe eine Zahl ist: echo -n "Eingabe: " read eingabe hier soll er's testen: wenn Zahl, dann die while-do-Schleife sonst exit Gibt es da eine Möglichkeit?
|
wag
Anmeldungsdatum: 2. Januar 2008
Beiträge: 8
|
Nur ein Ansatz:
#!/bin/bash
echo -n "Eingabe: "
read eingabe
if [[ `echo "$eingabe" | grep [[:digit:]]` ]]
then
echo "While-Schleife"
else
echo "Falsche Eingabe"
fi erwischt leider auch Eingaben wie '556asd31d' wenn du nur eine Zahl suchst:
if [[ "$eingabe" = [[:digit:]] ]]
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Kann man vielleicht testen ob es ein Integer ist?
|
DrScott
Ehemalige
Anmeldungsdatum: 7. Juli 2005
Beiträge: 6018
Wohnort: Nürnberg
|
Um mal wags Idee aufzugreifen: #!/bin/bash
echo -n "Eingabe: "
read eingabe
if [[ `echo "$eingabe" | grep -E ^[[:digit:]]+$` ]]
then
echo "While-Schleife"
else
echo "Falsche Eingabe"
fi Akzeptiert nur Integer. "556asd31d" ist kein Integer... 😉
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
|
barcc
Anmeldungsdatum: 13. Juli 2007
Beiträge: 696
Wohnort: Dortmund
|
#!/bin/bash
read -p "Eingabe: " eingabe
if ((zahl=$eingabe)) 2>/dev/null
then
# es werden auch hexadezimale Zahlen (0x123456)
# oktale Zahlen (0123456) und Ausdrücke (-7*4)
# erkannt und in Dezimalzahl $zahl umgerechnet
echo "ok: $eingabe hat den Wert $zahl"
else
echo "fehler: $eingabe ist keine Zahl"
fi
read -p "Eingabe: " eingabe
if ((zahl=$eingabe)) 2>/dev/null && [[ $eingabe == $zahl ]]
then
# nur ganze Dezimalzahlen erlaubt
echo "ok: $zahl"
else
echo "fehler: $eingabe ist keine Zahl"
fi
|
Blattlaus
Anmeldungsdatum: 29. März 2006
Beiträge: 1399
|
barcc hat geschrieben: #!/bin/bash
read -p "Eingabe: " eingabe
if ((zahl=$eingabe)) 2>/dev/null
then
# es werden auch hexadezimale Zahlen (0x123456)
# oktale Zahlen (0123456) und Ausdrücke (-7*4)
# erkannt und in Dezimalzahl $zahl umgerechnet
echo "ok: $eingabe hat den Wert $zahl"
else
echo "fehler: $eingabe ist keine Zahl"
fi
read -p "Eingabe: " eingabe
if ((zahl=$eingabe)) 2>/dev/null && [[ $eingabe == $zahl ]]
then
# nur ganze Dezimalzahlen erlaubt
echo "ok: $zahl"
else
echo "fehler: $eingabe ist keine Zahl"
fi
Öhm...dein Code ist kompletter Blödsinn.
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
DrScott hat geschrieben: Um mal wags Idee aufzugreifen: #!/bin/bash
echo -n "Eingabe: "
read eingabe
if [[ `echo "$eingabe" | grep -E ^[[:digit:]]+$` ]]
then
echo "While-Schleife"
else
echo "Falsche Eingabe"
fi Akzeptiert nur Integer. "556asd31d" ist kein Integer... 😉
Okay, das werde ich später mal ausprobieren. Denn while akzeptiert ja meines Wissens nach nur Integer. Danke aber auch an die anderen. ☺
|
MJerry
Anmeldungsdatum: 11. November 2007
Beiträge: 6
|
meine Variante - Test, ob eine Auswahl mit select auch ein gültiges Ergebnis bringt: | REPLY=
while [ -z "$REPLY" -o -n "${REPLY//[0-9]/}" ] || [ $REPLY -lt 1 -o $REPLY -gt 3 ]; do
select RESULT in "Auswahl_1" "Auswahl_2" "Auswahl_3"; do break; done
done
|
also: 1) ob REPLY kein Leerstring ist und keine nichtnumerischen Zeichen enthält (sprich: wenn alle Ziffern entfernt sind, muss REPLY leer sein); 2) ob REPLY innerhalb der vorgegebenen Grenzen ist.
|
Kinch
Anmeldungsdatum: 6. Oktober 2007
Beiträge: 1261
|
Zumindest in der Z-Shell kann man Typen auch deklarieren, so dass in einer Variable nur Integer, Float oder ähnliches enthalten sind. Das geht mit 'typeset. Und ja: Zumindest ich bin mir bewusst, dass der Thread 3 Jahre alt ist.
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Servus, Bash und typeset :
$ typeset -i foo
$ read foo
hallo
$ echo $foo
0
Aber so simpel ist das auch nicht, denn:
typeset [-aAfFgilrtux] [-p] [name[=value] ...]
[...]
-i The variable is treated as an integer; arithmetic
evaluation (see ARITHMETIC EVALUATION above) is
performed when the variable is assigned a value.
Das heißt:
$ hallo=8
$ typeset -i foo
$ read foo
hallo
$ echo $foo
8
|
MJerry
Anmeldungsdatum: 11. November 2007
Beiträge: 6
|
Kinch schrieb: Und ja: Zumindest ich bin mir bewusst, dass der Thread 3 Jahre alt ist.
nicht nur du 😛 nichtsdestotrotz - wenn ich über ihn stolper, wenn ich gewisse Sachen google, dann issers auch wert, mit Zusatzschmarrn befüllt zu werden.
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1563
Wohnort: Terra incognita
|
MJerry schrieb: Kinch schrieb: Und ja: Zumindest ich bin mir bewusst, dass der Thread 3 Jahre alt ist.
nicht nur du 😛 nichtsdestotrotz - wenn ich über ihn stolper, wenn ich gewisse Sachen google, dann issers auch wert, mit Zusatzschmarrn befüllt zu werden.
O.k. - ich mache mit! 😊 Mein Ansatz:
| #!/bin/bash
ziffern="${1//[![:digit:]]/}"
[ ! ${#ziffern} = ${#1} ] || [ ! ${1} ] && exit 1
echo Integer
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12837
|
Um die Vielfalt zu erweitern: es geht auch mit expr : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | $ for s in '' 0 1 234 ab ab678 987ba; do echo "<$s>"; expr "$s" : '[0-9]\+$' >/dev/null && echo OK || echo NOK; done
<>
NOK
<0>
OK
<1>
OK
<234>
OK
<ab>
NOK
<ab678>
NOK
<987ba>
NOK
|
☺ Ciao robert
|
TausB
Anmeldungsdatum: 26. November 2009
Beiträge: 1563
Wohnort: Terra incognita
|
rklm schrieb: Um die Vielfalt zu erweitern: es geht auch mit expr :
Mist! - Deine Lösung in kürzer. 😉 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | $ for s in '' 0 1 234 ab ab678 987ba; do echo "<$s>"; z="${s//[![:digit:]]/}"; [ ! ${#z} = ${#s} ] || [ ! ${s} ] && echo NOK || echo OK; done
<>
NOK
<0>
OK
<1>
OK
<234>
OK
<ab>
NOK
<ab678>
NOK
<987ba>
NOK
|
|