hoe shell-scriptvlaggen en -argumenten correct te parsen met getopts

Ik gebruik dit:

bijvoorbeeld ./imgSorter.sh -d directory -f format

de scripts” content is:

#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

use cases:

$ ./imgSorter.sh -d myDir -d was triggered with myDir OK

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: hoe komt het dat een string die begint met – niet wordt gedetecteerd als een vlag?

Antwoord

Je hebt getopts verteld dat de -d optie zou een argument moeten hebben, en in de commandoregel gebruik je -d -f myformat wat duidelijk (?) zegt “-f is de argument dat ik “geef aan de -d optie”.

Dit is geen fout in de code, maar in het gebruik van het script op de opdrachtregel.

Uw code moet verifiëren dat de optie-argumenten correct zijn en dat alle opties op de juiste manier zijn ingesteld.

Mogelijk zoiets als

while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi 

Als de -d optie optioneel is, en als u een standaard waarde wilt gebruiken voor de variabele dir in de bovenstaande code, zou u beginnen door dir in te stellen op die standaardwaarde vóór de while loop.

Een opdrachtregeloptie kan niet zowel een argument als een argument aannemen.

Opmerkingen

  • ok bedankt @Kusalananda, ik nam ten onrechte aan dat getopts elke – voor het begin van een vlag kostten.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *