Terminalopdrachten hebben meestal opties of schakelaars, die je kunt gebruiken om aan te passen hoe de opdracht doet wat het doet. Opties zijn opgenomen in de POSIX-specificatie voor opdrachtregelinterfaces. Het is ook een aloude conventie uit de vroegste UNIX-toepassingen, dus het is goed om te weten hoe je ze in je Bash-scripts opneemt als je je eigen opdrachten maakt.
De strategie voor het ontleden van opties in Bash is het doorlopen van alle argumenten die aan de shellscript worden doorgegeven, bepalen of ze een optie zijn of niet, en dan overgaan naar het volgende argument. Herhaal dit proces totdat er geen opties meer overblijven.
Begin met een eenvoudige Booleaanse optie (ook wel schakelaar of vlag genoemd):
#!/bin/bash while [ True ]; do if [ "$1" = "--alpha" -o "$1" = "-a" ]; then ALPHA=1 shift 1 else break fi done echo $ALPHA
In de code maken we een while
-lus die dient als oneindige lus totdat er geen argumenten meer zijn om te verwerken.
Een if
-statement probeert het argument op de eerste positie ($1
) te koppelen aan --alpha
of -a
.
Dit zijn willekeurige optienamen zonder speciale betekenis.
In een echt script zou je --verbose
en -v
kunnen gebruiken om verbose (extra) uitvoer met meer details te activeren.
Het sleutelwoord shift
zorgt ervoor dat alle argumenten met 1 verschuiven, zodat een argument op positie 2 ($2
) wordt verplaatst naar positie 1 ($1
).
De else
-instructie wordt geactiveerd wanneer er geen argumenten meer zijn om te verwerken, waardoor de while
-lus wordt verbroken.
Aan het einde van het script wordt de waarde van $ALPHA
weergegeven in de terminal.
Test het script:
dany@pindabook:~>bash ./test.sh --alpha
1 dany@pindabook:~>bash ./test.sh
dany@pindabook:~>bash ./test.sh -a
1
De optie is correct gedetecteerd.
Er is echter een probleem: extra argumenten worden genegeerd.
dany@pindabook:~> bash ./test.sh --alpha foo
1
Om argumenten op te vangen die niet bedoeld zijn als opties, kun je resterende argumenten dumpen in een Bash array.
#!/bin/bash while [ True ]; do if [ "$1" = "--alpha" -o "$1" = "-a" ]; then ALPHA=1 shift 1 else break fi done echo $ALPHA ARG=( "${@}" ) for i in ${ARG[@]}; do echo $i done
Test de nieuwe versie van het script:
dany@pindabook:~>bash ./test.sh --alpha foo
1 foo dany@pindabook:~>bash ./test.sh foo
foo dany@pindabook:~>bash ./test.sh --alpha foo bar
1 foo bar
Sommige opties hebben een eigen argument nodig. Je wilt de gebruiker bijvoorbeeld in staat stellen een attribuut in te stellen, zoals een kleur of de resolutie van een afbeelding, of jouw toepassing verwijzen naar een aangepast configuratiebestand.
Om dit in Bash te implementeren, kun je het shift
sleutelwoord gebruiken zoals je deed met Boolean schakelaars, maar verschuif de argumenten met 2 in plaats van 1.
#!/bin/bash while [ True ]; do if [ "$1" = "--alpha" -o "$1" = "-a" ]; then ALPHA=1 shift 1 elif [ "$1" = "--config" -o "$1" = "-c" ]; then CONFIG=$2 shift 2 else break fi done echo $ALPHA echo $CONFIG ARG=( "${@}" ) for i in ${ARG[@]}; do echo $i done
In de code voegen we een elif
-clausule toe om elk argument te vergelijken met zowel --config
als -c
.
Bij een overeenkomst wordt de waarde van een variabele genaamd CONFIG
ingesteld op de waarde van het tweede argument, dit betekent dat de --config
optie een argument vereist.
Alle argumenten verschuiven met 2: 1 om --config
of -c
te verschuiven, en 1 om zijn argument te verschuiven.
Zoals gebruikelijk wordt de lus herhaald totdat er geen overeenkomende argumenten meer overblijven.
Hier is een test van de nieuwe versie van het script:
dany@pindabook:~>bash ./test.sh --config mijn.conf foo bar
mijn.conf foo bar dany@pindabook:~>bash ./test.sh -a --config mijn.conf baz
1 mijn.conf baz
Er zijn andere manieren om opties in Bash te ontleden (parsen).
Je kunt afwisselend een case
statement of de opdracht getopt
gebruiken.
Wat je ook kiest, opties voor gebruikers zijn belangrijk voor elke toepassing, en Bash maakt het gemakkelijk.