[BASH] while loop, testen of input numeriek is

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Hoi,

Ik ben een script aan het schrijven zodat gebruikers hun alarm zelf kunnen instellen ( 1 maal per uur). Dit alarm werkt via de cron.

Ze mogen dus enkel een getal invullen tussen 0 en 59, als ze iets anders invullen, moet het script blijven vragen achter de waarde.

Ik dacht een while-loop te gebruiken, maar ik zit hier een beetje vast wanneer er een letter ipv een cijfer gebruikt wordt.

Ik heb al wat opzoekwerk verricht, en heb al het juiste statement gevonden voor in mijn if-statement. Ik heb dit eerst proberen te kopiëren naar de while-statement, maar dit geeft blijkbaar fouten

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash



         while [ "$B" -lt "00" ] || [ "$B" -gt "59" ]
         do
            echo "please give the alarm-threshold (a number between 0 and 59)"
            echo "example: 15 \n"

            read B

            if echo "$B" | grep -q -v "[^0-9]"
            then
               if [ "$B" -ge "00" ] && [ "$B" -le "59" ]
               then
                  echo ""
                  echo "threshold set to $B \n"
               else
                  echo ""
                  echo "number is not between 00 and 59 : $B"
                  echo "threshold is not set \n"
               fi
            else
               echo "$B is not a number"
            fi
         done


Alle hulp is welkom!

[ Voor 1% gewijzigd door ZodiacQ op 07-09-2010 11:32 . Reden: schrijffouten :) ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik heb weinig kennis van bash, maar volgens mijn wil je je or ( || ) veranderen in een and ( && ). Je if wilde je waarschijnlijk uitvoeren als het wel een getal is, je while wil je uitvoeren zolang het geen getal is, waardoor je ofwel de hele expressie moet ontkennen met een not-operator, ofwel alle boolean operators omwisselen. :)

Verder: Waar hoort mijn topic?

PRG >> NOS

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Wirf
  • Registratie: April 2000
  • Laatst online: 04-09 08:21
Altijd leuk, stoeien met Bash :-)

Probeer dit eens

Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
B=-1
while [ "$B" -lt 59 ] || [ "$B" -gt 00 ]
do
        echo "please give the alarm-threshold (a number between 0 and 59)"
        echo "example: 15"

        read B

        if echo "$B" | grep -q "^[0-9]*$"; then
                if [ "$B" -ge "00" ] && [ "$B" -le "59" ]; then
                        echo ""
                        echo "threshold set to $B"
                        break
                else
                        echo
                        echo "number is not between 00 and 59 : $B"
                        echo "threshold is not set"
                fi
        else
                echo "$B is not a number"
               B=-1
        fi
done

Heeft sinds kort zijn wachtwoord weer terug gevonden!


Acties:
  • 0 Henk 'm!

  • Bucket
  • Registratie: September 2002
  • Laatst online: 19:25
Je zou dit kunnen proberen:

a=100

if [ `expr $a + 1 2> /dev/null` ] ; then
echo $a is numeric ;
else
echo $a is not numeric ;
fi ;

En binnen bash kan je ook typeset -i gebruiken, zodat je variable altijd een integer is.

Acties:
  • 0 Henk 'm!

  • Aetos
  • Registratie: November 2001
  • Laatst online: 22-08 00:14
Als je een letter gebruikt ipv een cijfer gaat het in eerste instantie goed. Je detecteert dat het een niet nummerieke invoer is. Maar in de while lus staat dan ineens
code:
1
"a" -lt 00 || "a" -gt 59


Je moet dus voorkomen dat de while lus ooit gebruikt kan worden terwijl B een nonnumerieke inhoud heeft.

Hint: De eerste aanpassing van wirf is handig. Maar ik zou hem een paar keer gebruiken.


Ik snap trouwens niet waarom je \n gebruikt.

code:
1
2
3
4
5
6
7
threshold is not set \n
please give the alarm-threshold (a number between 0 and 59)
example: 15 \n
a
a is not a number
uur.sh: line 4: [: a: integer expression expected
uur.sh: line 4: [: a: integer expression expected

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Deze functie gebruik ik om numeric checks te doen binnen bash.
Het voordeel is hier dat je geen grep of andere subprocessen moet starten:

Bash:
1
2
3
4
5
6
7
8
9
function isnum() {
  local VAR="$1"
  case "$VAR" in
     *[^0-9]*)
        return 1
        ;;
  esac
  return 0
}

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

H!GHGuY schreef op dinsdag 07 september 2010 @ 12:49:
Deze functie gebruik ik om numeric integer checks te doen binnen bash.
;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Tnx voor alle reacties.

@wirf: Dit werkt, maar als ik bvb niets ingeef en gewoon op Enter druk, dan is het spelletje uit.

kan ik soms werken met null?

code:
1
while [ "$B" -lt 59 ] || [ "$B" -gt 00 ] || [ "$B" != NULL ]



@Aetos: Ja, de \n is een foutje van mij :)

@H!GHGuY: hier heb ik ook mee zitten knoeien (had dit ook al ergens op internet gezien), maar hoe implementeer ik zo een functie in een while lus, samen met de andere voorwaarden?
Iets in de volgende zin:

code:
1
2
3
4
while [ isnum $B ] || [ "$B" -lt 59 ] || [ "$B" -gt 00 ]
do
...
done

[ Voor 13% gewijzigd door ZodiacQ op 07-09-2010 13:33 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een lege string is geen null.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
tnx voor de hint.

Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
while read -p"number of minutes: " B
do
  case "$B" in
    [0-9]|[0-9][0-9]) test $B -lt 60 && break; echo from 0 to 59 please ;;
    *) echo enter a number of 1 or 2 digits ;;
  esac
done
test -z "$B" && {
  echo emergency exit
  exit 2
}
echo now do something with $B

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ZodiacQ schreef op dinsdag 07 september 2010 @ 13:30:
@H!GHGuY: hier heb ik ook mee zitten knoeien (had dit ook al ergens op internet gezien), maar hoe implementeer ik zo een functie in een while lus, samen met de andere voorwaarden?
code:
1
2
3
4
while isnum $B && [ "$B" -lt 59 -o "$B" -gt 00 ]
do
...
done


zoiets?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • jayvol09
  • Registratie: Augustus 2009
  • Laatst online: 02-09-2020
Als je die door pipe't naar wc -m zal ie denk wel 0 geven.

"Between the weak and the strong one it is the freedom which oppresses and the law that liberates" [Jean Jacques Rousseau]


Acties:
  • 0 Henk 'm!

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 11-08 04:52

Sprite_tm

Semi-Chinees

Regexps to the rescue! :P
code:
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

echo "Nummer, 0-59, jeweetwel."
read input
while ! [[ $input =~ ^[0-5]?[0-9]$ ]]; do
    echo "$input is nie goe nie :/"
    read input
done

echo "Woei, $input!"


Edit: Laat :/ Nja, een extra oplossing is nooit weg.

[ Voor 10% gewijzigd door Sprite_tm op 10-09-2010 15:36 ]

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog

Pagina: 1