LX-SCR-INFO-while
Updated 7/27/2010 00:48
while
Anders dan
for, blijft
while wachten, zolang een voorwaarde vervult is, om telkens opnieuw hetzelfde te doen.
- Syntax:
while <voorwaarde>
do
<commandos>
done
- voorbeeld:
#!/bin/bash
#
# bye2quit: blijft draaien zolang je geen bye hebt ingetikt
#
inleestekst=dag
while [ "$inleestekst" != "bye" ]
do
echo "Tik iets in ... (bye om te stoppen)"
read inleestekst
echo "Je hebt: $inleestekst ingetikt"
done
en wordt uitgevoerd als volgt:
$ bye2quit
Tik iets in ... (bye om te stoppen)
321
Je hebt: 321 ingetikt
Tik iets in ... (bye om te stoppen)
Je hebt: ingetikt
Tik iets in ... (bye om te stoppen)
bye
Je hebt: bye ingetikt
$
Een until draait de voorwaarde om, maar doet precies hetzelfde:
#!/bin/bash
#
# 2bye2quit: blijft draaien zolang je geen bye hebt ingetikt
#
inleestekst=dag
until [ "$inleestekst" = "bye" ]
do
echo "Tik iets in ... (bye om te stoppen)"
read inleestekst
echo "Je hebt: $inleestekst ingetikt"
done
- Files lezen met while
In het hoofdstuk over for, hebben we gezien dat output lezen met for problematisch wordt indien we dit regel per regel willen doen. for ziet namelijk de spatie als scheidingsteken tussen data en focust op "woorden" , en we moeten trucks als sed en/of tellers gebruiken om for te dwingen toch hele tekstregels te lezen.
Met while wordt het veel makkelijker:
syntax:
while read $tekstregel
do
<commandos>
done < bestandsnaam
voorbeeld:
#!/bin/bash
#
# gebrlist: kijkt in de passwd file alle gebruikers na met userid >= 500
# en drukt een lijst uid - username
#
bestand="/etc/passwd"
while read line
do
gebruiker=$(echo $line | awk -F: '{print $1}')
gebrid=$(echo $line | awk -F: '{print $3}')
if [ "$gebrid" -gt "500" ]
then
echo $gebrid $gebruiker
fi
done < $bestand
- oefeningen:
- schrijf een interactief script 'superkill' dat de ingegeven parameter ($1) gebruikt om alle draaiende processen case insensitive te greppen op deze parameter. Per match wordt de processnaam en de pid op scherm gebracht met de vraag of dit proces gekilld mag worden. Indien ja wordt er effectief gekilld.
- Maak een bestand met als naam "leden" (met op elke regel een naam, geslacht en taalcode) van de vorm:
ludo m n
claire v n
luc m f
gregory m e
marleen v f
corsendonk donker
Schrijf een script URwelkom dat dit bestand leest, nu met een while loop, en druk telkens een correcte aanspreektitel af (in de juiste taal), gevolgd door de naam. (vb: Bonjour Monsieur Luc)