jak poprawnie przeanalizować flagi i argumenty skryptu powłoki za pomocą getopts

Używam tego:

na przykład ./imgSorter.sh -d directory -f format

skrypty” zawartość to:

#!/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 

przypadki użycia:

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

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: jak to się dzieje, że ciąg zaczynający się od – nie jest wykrywany jako flaga?

Odpowiedź

Poinformowałeś getopts, że -d powinna przyjmować argument, a w wierszu poleceń używasz -d -f myformat, co wyraźnie (?) mówi „-f to argument I „daję opcję -d„.

To nie jest błąd w kodzie, ale w użyciu skryptu w linii poleceń.

Twój kod musi zweryfikować, czy argumenty opcji są poprawne i czy wszystkie opcje są ustawione w odpowiedni sposób.

Prawdopodobnie coś takiego jak

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 

Jeśli opcja -d jest opcjonalna i jeśli chcesz użyć domyślnej wartości zmiennej dir w powyższym kodzie należy rozpocząć od ustawienia dir na tę wartość domyślną przed while pętla.

Opcja wiersza poleceń nie może zarówno przyjmować, jak i nie przyjmować argumentów.

Komentarze

  • ok, dziękuję @Kusalananda, błędnie założyłem, że getopts zajęło co – na początek flagi.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *