LX-SCR-INFO-basisregels
Updated 7/27/2010 01:08

basisregels

  1. shebang en kommentaar

    Bekijk nog een keer het laatste script van het hoofdstuk introductie:

    df | grep "^/dev" | awk '{print $1,"size",$2,"used",$3,"free",$4}' | column -t
    swapon -s | grep "^/dev" | awk '{print $1,"size",$3,"used",$4}' | column -t
    free | grep "Mem" | awk '{print $1,"size",$2,"used",$3,"free",$4}' | column -t

    Dit script gebruikt een linux shell. Wij hebben het specifiek geschreven voor bash (bourne again shell). Maar dat weet een eventuele volgende gebruiker misschien niet. En als wij ons eigen script overzetten naar een andere computer, wordt er misschien een andere standaardshell gebruikt.

    Om problemen die hieruit kunnen voortvloeien te voorkomen, begint elk zichzelf repecterend linux/unix shellscript met de shebang:

    #!/bin/bash

    Dit is het path naar de shell, en de shell zelf!
    Nu weet de computer met welke 'shell-interpreter' hij dit script moet uitvoeren.

    Kommentaar
    : het is nuttig en noodzakelijk je scripts te voorzien van kommentaar. Die kommentaar bevat op zijn minst de naam van het script, en wat het nu script precies doet. Een datum en een maker is ook nuttig. Als je dan twee versies tegenkomt, weet je tenminste welke versie het meest recent is. Kom je een script tegen van een collega (of een ex-collega) dan heb je op zijn minst een idee waar je met je vragen terecht zou kunnen. Tenslotte worden belagrijk stappen in elk script voorzien van kommentaar over wat dit commando nu doet.

    Als we dit allemaal toepassen krijgen we het volgende:

    #!/bin/bash
    #
    # space
    #
    # een script dat groote en vrije ruimte op scherm brengt van
    # gemounte schijven
    # swapspace
    # en geheugen
    #
    # bvdb 10 juni 2010
    #

    # breng vrije ruimte van gemounte media op scherm, formatteer de output met awk en column
    df | grep "^/dev" | awk '{print $1,"size",$2,"used",$3,"free",$4}' | column -t

    # breng swapspace op scherm
    swapon -s | grep "^/dev" | awk '{print $1,"size",$3,"used",$4}' | column -t

    # breng geheugengebruik op scherm

    free | grep "Mem" | awk '{print $1,"size",$2,"used",$3,"free",$4}' | column -t

    # einde



  2. echo, read en variabelen

    Met echo en read brengen we interactie in ons script:
    echo brengt informatie op scherm vanuit het script,
    read leest informatie in van de gebruiker.
    Een variabele is een plaats in het geheugen waar bash tijdelijk informatie opslaat.

    De meeste werken over bash beginnen met het volgende script:

    #!/bin/bash
    echo Hello World


    En je zou het kunnen uitbreiden als volgt:

    #!/bin/bash
    #
    # dagjij: voorbeeld op echo en read
    #
    # basisregels bash scripting 10 juni 2010
    #
    echo Hoe heet jij?
    read uwnaam
    echo
    echo Dag $uwnaam

    In dit voorbeeld met als naam 'dagjij' wordt er naast echo en read ook een variabele geïntroduceerd.

    Wat de gebruiker intikt, totdat hij <enter> drukt, komt even terecht in de variabele uwnaam.

    Om de waarde van deze variabele op scherm te brengen wordt
    echo $uwnaam

    uitgevoerd.

    Het dollarteken zegt tegen echo dat het de waarde van de variabele uwnaam moet afdrukken, en niet de string "uwnaam". De echo zonder meer op regel 11 zorgt voor een blanco lijn.

  3. oefeningen

    1. Voorzie de oefening 'tedoen' uit het hoofdstuk introductie van een shebang en kommentaar.

    2. Schrijf een script met als naam jaarkal dat een jaar opvraagt, en daarna de kalender van dat jaartal op scherm brengt. Vergeet de kommentaar niet en de shebang.

    3. Schrijf een script met als naam maandkal dat eerst het jaartal, en daarna de maand opvraagt, en dan van die maand de kalender opscherm brengt.

    4. Schrijf een script met de naam statistiek. Breng eerst op scherm "Vandaag is de datum", gevolgd door de huidige tijd en datum op een nieuwe lijn, dan op de volgende regel "Het aantal aangelogde gebruikers is", met op de volgende regel het aantal ingelogde gebruikers, en tot slot "uw huidige directory is:" gevolgd door de huidige directory.

    5. Schrijf een script dat een gebruikersnaam opvraagt, en de totale grootte (bezetting) van alle files en subdirectories van de homedirectory van die gebruiker op scherm brengt.

  4. printf

    Zowel echo als printf zijn 'bash built-in' commando's. Net zoals read, cd, pwd en alias en nog een tiental andere. Je vindt deze commando's niet terug op het filesysteem; ze zijn een onderdeel van de shell zelf. (ls, cat en grep en nog enkele honderden tot duizenden andere commando's vind je wel terug op het filesysteem - meestal in /bin en /usr/bin)

    Het echo commando sluit de regel altijd af met een linefeed en op standard output.
    Het printf commando laat toe formaat strings me te geven.

    #!/bin/bash
    #
    # dagjij2
    #
    # voorbeeld op printf en read
    #
    # basisregels bash scripting 10 juni 2010
    #
    printf "Hoe heet jij? "
    read uwnaam
    printf "\nDag $uwnaam\n"

    Een \n staat voor een linefeed, een \n\n voor een dubbele linefeed. Als je geen \n plaatst komt de volgende printf gewoon op dezelfde terminalregel.
    Probeer zelf maar eens wat er gebeurt als je de allerlaatste \n weglaat in printf "\nDag $uwnaam"

    In de man pagina van printf vinden we onder andere volgende mogelijkheden:
           \\     backslash
           \a     alert (BEL)
           \b     backspace
           \c     produce no further output
           \f     form feed
           \n     new line
           \r     carriage return
           \t     horizontal tab
           \v     vertical tab
    enzoverder.

  5. Oefeningen

    Herwerk de oefeningen van vorige paragraaf met printf ipv echo:

    1. Schrijf een script met als naam maandkal dat eerst het jaartal, en daarna de maand opvraagt, en dan van die maand de kalender opscherm brengt.

    2. Schrijf een script met de naam statistiek. Breng eerst op scherm "Vandaag is de datum", gevolgd door de huidige tijd en datum op dezelfde lijn, dan op de volgende regel "Het aantal aangelogde gebruikers is", met op dezelfde regel het aantal ingelogde gebruikers, en tot slot "uw huidige directory is:" gevold door de huidige directory.