Hello nagyérdemű tisztelt fórumozók!
Feltétel vizsgálatot szeretnék végrehajtani bash segítségével.
Ha nem szám, akkor hiba. Ha szám de kisebb mint 0 és nagyobb mint 24 akkor hiba.
Ha sima enter akkor hiba.
echo -ne "Add meg az adatot (óra) "
while read OO; do
ERROR=0
if [ ${OO} -eq ${OO} 2> /dev/null ]; then
if [[ (${OO} -lt 0 || ${OO} -gt 23) ]]; then
ERROR=1
fi
else ERROR=1
fi
if [ ${ERROR} -eq 0 ]; then
echo OK - Minden adat jó.
break
else
echo HIBA
echo -ne "Add meg újra az adatot: "
fi
done
echo kiléptünk mert jó.
Nem tudom hogy ezt így kell-e megoldani, mindenesetre sajnos ez a sima entert elfogadja jó értéknek.
A while ciklusból meg sehogy máshogy csak a break-kel tudok kilépni, holott mintha az lenne a dolga hogy csak addig ismételje a kérdést amíg jó értéket nem kap.
- 1363 megtekintés
Hozzászólások
A read enterig olvas, ergo barmit is raksz OO-ba igaz lesz a while.
- A hozzászóláshoz be kell jelentkezni
A konkret problemara a lenti egy megoldas bash-ben, de mindenkepp javaslom tanulmanyozasra az Advanced Bash Scripting Guide-ot, illetve az adott shell man oldalat
#! /bin/bash
# a regexet azert erdemes valtozoban tarolni, mert igy nem kell szivni azzal,
# hogy nemely bash verzio idezojelekkel varja a regexet, a tobbi meg anelkul
# megjegyzes: ez esetleg meglepo inputokat is elfogadhat: 0000, 00012 stb.
regex='^[0-9][0-9]*$'
# amig nem jo az input, olvass ujra
while true
do
# az 'echo -n'-nel hordozhatobb a printf
printf 'input: '
# ez egy sort olvas az 'ora' valtozoba
read ora
# ha minden jo, hagyd abba
if [[ $ora =~ $regex && $ora -ge 0 && $ora -le 23 ]]
then
break
else
printf 'invalid input, try again\n'
fi
done
printf "ora=$ora\n"
- A hozzászóláshoz be kell jelentkezni
Köszi a választ.
Jobban meg kell ismernem a regexpet.
Viszont a printf-hez visszatérve. Azért echo, mert színezem a kiírást.
A printf-et is lehet? A man nem írja.
Jelenleg így színezek:
# színek
Red="$(tput bold ; tput setaf 1)"
Green="$(tput bold ; tput setaf 2)"
Cyan="$(tput bold ; tput setaf 6)"
Yellow="$(tput bold ; tput setaf 3)"
NC="$(tput sgr0)" # No Color
echo -ne ${Cyan} "Add meg az adatot (óra) "
- A hozzászóláshoz be kell jelentkezni
A fenti regex (regular expression) azt jelenti, hogy a sor eleje (^) es a sor vege ($) kozott csak szamjegyek lehetnek ([0-9]), minimum 1 db. Az Advanced Bash Scripting Guide-ban is van roluk szo, de lehet jobban jarsz, ha keresel a weben valami grep-rol szolo tutorialt, ami egyszerubben kezdi. Kicsit is osszetettebb input ellenorzesehez szinte nelkulozhetetlenek.
A szinezesnek ugyanugy mukodnie kell printf-fel, mert az a terminalon mulik, nem azon, hogy mi irja ki a szinezest vezerlo karaktereket.
printf "$(tput bold)asdf\n$(tput sgr0)"
- A hozzászóláshoz be kell jelentkezni
majdnem jo', de a 08-at meg a 09-et nem fogadja el... (hulye dolog, en is mar tobbszor belefutottam mikor datum-ertekeket kellett feldolgozni). javitas, peldaul: a feltelbe $ora helyett $((10#$ora))-t irj, majd a vegen egy ora=$((10#$ora)) is legyen.
- A hozzászóláshoz be kell jelentkezni
Jogos az eszrevetel, viszont ebben van egy masik apro bibi, ez:
$ echo 33 | bash test.sh
input: invalid input, try again
input: ora=0
Meg a read utan se art breakelni, ha nem volt sikeres, szoval igy egy fokkal jobb (hacsak nincsenek benne ujabb bugok :-)
#! /bin/bash
regex='^[0-9][0-9]*$'
while true
do
printf 'input: '
read ora || break
if [[ $ora =~ $regex && $((10#$ora)) -ge 0 && $((10#$ora)) -le 23 ]]
then
break
else
printf 'invalid input, try again\n'
fi
done
if [[ ! -z $ora ]]
then
ora=$((10#$ora))
fi
printf "ora=$ora\n"
- A hozzászóláshoz be kell jelentkezni