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.

  1. Syntax:

    while
    <voorwaarde>
    do
    <commandos>
    done

  2. 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


  3. 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

  4. oefeningen:

    1. 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.

    2. 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)