hvordan man korrekt analyserer shell script-flag og argumenter ved hjælp af getopts

I “m ved hjælp af dette:

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

scriptets” indhold 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 kan det være, at en streng, der begynder med – ikke registreres som et flag?

Svar

Du har fortalt getopts at -d -indstillingen skal tage et argument, og i kommandolinjen bruger du -d -f myformat som tydeligt (?) siger “-f er argument Jeg giver til -d -indstillingen.

Dette er ikke en fejl i koden, men i brugen af scriptet på kommandolinjen.

Din kode skal kontrollere, at option-argumenterne er korrekte, og at alle indstillinger er indstillet på en passende måde.

Eventuelt noget i retning af

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 indstillingen -d er valgfri, og hvis du vil bruge en standard -værdi til variablen dir i koden ovenfor starter du med at indstille dir til den standardværdi før while loop.

En kommandolinjemulighed kan ikke både tage og ikke tage et argument.

Kommentarer

  • ok tak @Kusalananda, jeg antog fejlagtigt, at getopts tog hver – til begyndelsen af et flag.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *