hvordan man korrekt kan analysere flagg og argumenter for skallskript ved hjelp av getopts

Jeg bruker dette:

for eksempel ./imgSorter.sh -d directory -f format

skriptene» innholdet er:

#!/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: hvordan er det at en streng som begynner med – ikke blir oppdaget som et flagg?

Svar

Du har fortalt getopts at -d -alternativet skal ta et argument, og i kommandolinjen bruker du -d -f myformat som tydelig (?) sier «-f er argument Jeg gir til -d -alternativet «.

Dette er ikke en feil i koden, men i bruken av skriptet på kommandolinjen.

Koden din må verifisere at alternativargumentene er riktige og at alle alternativene er satt på en passende måte.

Muligens noe sånt som

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 

Hvis alternativet -d er valgfritt, og hvis du vil bruke en standard -verdi for variabelen dir i koden ovenfor, vil du starte med å sette dir til den standardverdien før while loop.

Et kommandolinjealternativ kan ikke både ta og ikke ta et argument.

Kommentarer

  • ok takk @Kusalananda, jeg antok feilaktig at getopts tok hver – for begynnelsen av et flagg.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *