LX-SCR-INFO-parameters
updated 7/27/2010 01:07
parameters
- 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'
- 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
- oefeningen
- Schrijf een script met als naam uitv dat als argument een filenaam krijgt. Die filenaam wordt door het script dan executable gemaakt.
- 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.