LX-SCR-INFO-parameters
updated 7/27/2010 01:07

parameters

  1. wat zijn parameters

    Elke file, en dus ook een script heeft een naam.
    De naam van je script wordt een commando.
    Parameters zijn karakterstrings die je achter het commando van je script intikt. Parameters worden van het commando en van elkaar gescheiden door spaties of tabs.

    Als voorbeeld van dergelijke parameters kijken we even naar het commando which.

    which is een script.

    $ file $(which which)
    /usr/bin/which: symbolic link to `/bin/which'
    $ file /bin/which
    /bin/which: POSIX shell script text executable

    Je kan which gebruiken als

    $ which less
    /usr/bin/less

    of als

    $ which -a less
    /usr/bin/less
    /bin/less


    Zowel de optie -a als het argument less zijn parameters. Het is dus de script programmer die het script moet laten beslissen of een parameter al dan niet een optie of een argument is.

    Hoe gebruiken we nu parameters in scripts?

    Parameters worden opgeroepen met de combinatie van het $-teken en een cijfer.
    De eerste parameter wordt opgeroepen met $1, de tweede met $2 enz.

    Bekijk even het volgende voorbeeld met als naam showparams:

    #!/bin/bash
    #
    # showparams: een programma dat parameters laat zien
    #
    echo 'Dit is de eerste parameter - $1: '$1
    echo 'Dit is de tweede parameter - $2: '$2
    echo 'en als die is ingetikt is dit de derde - $3: '$3
    echo 'en dit is de scriptnaam zelf - $0: '$0
    echo 'alle parameters samen - $@: '$@
    echo 'en het aantal parameters - $#: '$#

    We voeren showparams uit als volgt:

    $ showparams één --twee drie
    Dit is de eerste parameter - $1: één
    Dit is de tweede parameter - $2: --twee
    en als die is ingetikt is dit de derde - $3: drie
    en dit is de scriptnaam zelf - $0: /home/user/bin/showparams
    alle parameters samen - $@: één --twee drie
    en het aantal parameters - $#: 3


    of ook

    $ showparams voilà
    Dit is de eerste parameter - $1: voilà
    Dit is de tweede parameter - $2:
    en als die is ingetikt is dit de derde - $3:
    en dit is de scriptnaam zelf - $0: /home/user/bin/showparams
    alle parameters samen - $@: voilà
    en het aantal parameters - $#: 1


    Een iets nuttiger voorbeeld is een veilig delete script. We noemen dit script wegermee:

    #!/bin/bash
    #
    # wegermee: een script dat files eerst kopieert naar /tmp
    # en ze dan pas verwijdert

    #
    # eerst kopieren we $1 naar /tmp
    cp -v $1 /tmp
    # nu verwijderen we $1
    rm -v $1

    De output van het script is als volgt:

    $ touch testfile
    $ wegermee testfile
    `testfile' -> `/tmp/testfile'
    removed `testfile'

  2. parameter $*

    Er bestaat ook nog een parameter $*
    Die doet bijna hetzelfde als $@ maar er is een verschil:

    $@
    geeft als output alle parameters, en die parameters zijn aparte strings.
    $* geeft als output alle parameters, maar samengebracht in slechts één string.

    Dat is in praktijk niet zo éénvoudig te tonen, omdat $@ de spatie als scheidingsteken tusen de strings gebruikt, en $* de strings aan mekaar plakt met een spatie ertussen.
    $@ is bijvoorbeeld 'een' 'twee' 'drie' 'vier'
    $* is dan 'een twee drie vier'
    En toon nu maar eens het verschil, want bash interpreteert de quotes !!!

    Met een ingewikkeld voorbeeld, apester, kunnen we het verschil wel zichtbaar maken. Herbekijk dit voorbeeld nog eens zodra je meer weet over for loops en functions (de for loop ziet geen verschil, de functie wel):

    #!/bin/bash
    #
    # apester: test het verschil tussen $@ en $*
    #
    function countme
    {
    echo $# functieparameters
    }
    echo je moet minstens 3 parameters meegeven in dit script

    teller=0
    echo eerst de \$\@
    for x in $@
    do
        let "teller += 1"
        echo teller\: $teller en x\: $x
    done
    countme "$@"
    teller=0
    echo nu de \$\*
    for x in $*
    do
        let "teller += 1"
        echo teller\: $teller en x\: $x
    done
    countme "$*"

    met als output:

    $ apester een twee drie vier
    je moet minstens 3 parameters meegeven in dit script
    eerst de $@
    teller: 1 en x: een
    teller: 2 en x: twee
    teller: 3 en x: drie
    teller: 4 en x: vier
    4 functieparameters
    nu de $*
    teller: 1 en x: een
    teller: 2 en x: twee
    teller: 3 en x: drie
    teller: 4 en x: vier
    1 functieparameters


  3. oefeningen

    1. Schrijf een script met als naam uitv dat als argument een filenaam krijgt. Die filenaam wordt door het script dan executable gemaakt.

    2. Soms doen we een rm met wildcards in het argument zoals $ rm *am*
      en dan zit er wel eens toevallig teveel in onze selectie. Jammer maar helaas!
      Schrijf daarom een script met de naam showrm dat eerst de te deleten bestanden op scherm pagineert, daarna wacht op "enter drukken om verder te gaan, ctrl-c om te stoppen", en tenslotte een rm -v doet van het argument.