Tips en Trucs 2023

Opties toevoegen aan Bash scripts

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.

Opties ontleden in Bash

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.

Argumenten detecteren in Bash

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

Opties met argumenten

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

Eenvoudige ontleding van opties

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.

Bash scripts options