LX-SCR-INFO-if
updated 7/27/2010 00:59

if

  1. voorwaarden

    Tot nog toe hebben we rechtlijnige scripts geschreven. Eigenlijk, konden we niet zoveel doen met onze bash scripts. Gewoon dingen achter mekaar, als een domme robot.

    Een script wordt pas echt een script als er ook kan getest worden of er aan (een) bepaalde voorwaarde(n) is voldaan. Dat doen we vooral met if en ook met case.

    De syntax van if is in bash nogal omslachtig. Hieronder volgt een voorbeeld van een script dat kijkt of een parameter $1 gelijk is aan de string --color :

    #!/bin/bash
    #
    # ifcolor: test of parameter $1 gelijk is aan --color
    #
    if [ $1 = "--color" ]
    then
    echo \$1 is gelijk aan --color
    fi

    en we testen:

    $ ifcolor --color
    $1 is gelijk aan --color

    maar als we geen parameter meegeven krijgen we volgende error:

    $ ifcolor
    /home/bert/bin/ifcolor: line 5: [: =: unary operator expected

    Dat komt omdat $1 tijdens het verloop van het script wordt vervangen door zijn waarde, en als er niets is, klopt de syntax niet meer! Gelukkig zijn er nog dubbele quotes: die laten $ tekens geïnterpreteerd door, en indien $1 dan niet bestaat, staat er nog steeds "", en dat is toegelaten:

    #!/bin/bash
    #
    # ifcolor: test of parameter $1 gelijk is aan --color
    #
    if [ "$1" = "--color" ]
    then
    echo \$1 is gelijk aan --color
    fi

    met als output:

    $ ifcolor --color
    $1 is gelijk aan --color
    $ ifcolor
    $

    Even resumeren:

    • de test staat na if en tussen blokhaken
    • wat uitgevoerd moet worden indien aan de voorwaarde is voldaan
      staat tussen then en fi
    • voor en na de blokhaken staan spaties
    • voor en na het gelijkheidsteken staan spaties
    • then en fi staan alleen op een volgende regel

    We kunnen dit script vervangen door slechts één regel, maar dan moeten we de kommapunt gebruiken als scheidingsteken tussen twee commandoregels.
    Let echter op!! Plaats geen ; achter then.

    #!/bin/bash
    #
    if [ "$1" = "--color" ]; then echo \$1 is gelijk aan --color; fi

  2. else

    We kunnen de if constructie uitbreiden met een else:

    als aan de voorwaarde voldaan is (if)
    doe dan dit (then)
    en anders dat (else)
    einde-als (fi)

    #!/bin/bash
    #
    # ifcolor: test of parameter $1 gelijk is aan --color
    #
    if [ "$1" = "--color" ]
    then
    echo \$1 is gelijk aan --color
    else
    echo \$1 is niet gelijk aan --color
    fi

    met als output:

    $ ifcolor
    $1 is niet gelijk aan --color
    $ ifcolor --color
    $1 is gelijk aan --color
    $ ifcolor 123
    $1 is niet gelijk aan --color

    zou het nu ook niet mooi zijn om te testen of $1 bestaat?

    #!/bin/bash
    #
    # ifcolor: test of parameter $1 gelijk is aan --color
    #
    if [ "$#" = "0" ]
    then
    echo \$1 is niet ingegeven
    else
    if [ "$1" = "--color" ]
    then
    echo \$1 is gelijk aan --color
    else
    echo \$1 is niet gelijk aan --color
    fi
    fi

    met de volgende output:

    $ ifcolor --color
    $1 is gelijk aan --color
    $ ifcolor 123
    $1 is niet gelijk aan --color
    $ ifcolor
    $1 is niet ingegeven

  3. oefeningen

    1. Keer nog even terug naar het script space uit de oefeningen van het hoofstuk intro.
      Herschrijf dit script zodanig dat het 3 opties kan accepteren (maar slechts één tegelijk) -m voor memory -s voor swap en -d voor diskspace. Indien geen optie wordt meegegeven worden memory, swap en diskspace afgedrukt (net zoals in de oefening uit intro)

    2. Schrijf een script met als naam welkom. Dit script krijgt van de gebruiker 3 parameters: een naam, een geslacht en een taal. Bedoeling is dat het script de output in de juiste taal plaatst (nl, fr of en) in de volgende vorm: Bonjour, Mme. Leroy of Goeiedag Meneer Cattoor enz. 

  4. andere testen

    strings:

    is gelijk aan: if [ "$var" = "string" ]

    niet gelijk aan: if [ "$var" != "string" ]

    komt voor in ascii volgorde: if [ "$var1" \< "$var2" ]

    komt achter in ascii volgorde: if [ "$var1" \> "$var2" ]

    integers:

    < kleiner dan: if (("$a" < "$b"))

    <= kleiner of gelijk:
    if (("$a" <= "$b"))


    > groter dan
    : if (("$a" > "$b"))

    >= groter of gelijk: if (("$a" >= "$b"))

    files:

    filenaam bestaat: if [ -e $file_naam_en_path ]


    filenaam is een reguliere file: if [ -f $file_naam_en_path ]

    filenaam is een directory: if [ -d $file_naam_en_path ]

    filenaam is een block device: if [ -b $file_naam_en_path ]

    filenaam is een char device: if [ -c $file_naam_en_path ]

    filenaam is een symbolic link: if [ -h $file_naam_en_path ]

    filenaam is een socket
    : if [ -S $file_naam_en_path ]

    filenaam is niet leeg
    : if [ -s $file_naam_en_path ]

    filenaam heeft leesrechten
    : if [ -r $file_naam_en_path ]

    filenaam heeft schrijfrechten: if [ -w $file_naam_en_path ]

    filenaam heeft execute rechten: if [ -x $file_naam_en_path ]

    jij bent eigenaar van de file: if [ -O $file_naam_en_path ]

    jij bent groepeigenaar van de file
    : if [ -G $file_naam_en_path ]


    file gewijzigd sedert laatste read
    : if [ -N $file_naam_en_path ]

    file1 is nieuwer dan file2: if [ file1 -nt file2 ]

    file1 is ouder dan file2: if [ file1 -ot file2 ]

    file1 en file2 zijn hardlinks tot dezelfde file: if [ file1 -ef file2 ]