feltétel vizsgálat

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.

Hozzászólások

A read enterig olvas, ergo barmit is raksz OO-ba igaz lesz a while.

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"

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 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)"

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"