Eu „folosesc acest lucru:
de exemplu
conținutul scripturilor este:
#!/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
cazuri de utilizare:
$ ./imgSorter.sh -d myDir -d was triggered with myDir
OK
$ ./imgSorter.sh -d -f myFormat -d was triggered with -f
NOK: cum este faptul că un șir care începe cu – nu este detectat ca un steag?
Răspuns
Ați spus getopts
că -d
opțiunea ar trebui să ia un argument, iar în linia de comandă utilizați -d -f myformat
care clar (?) spune „-f
este argument pe care îl dau opțiunii -d
„.
Aceasta nu este o eroare în cod, ci în utilizarea scriptului de pe linia de comandă.
Codul dvs. trebuie să verifice dacă argumentele opțiunii sunt corecte și că toate opțiunile sunt setate într-un mod adecvat.
Posibil ceva de genul
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
Dacă opțiunea -d
este opțională și dacă doriți să utilizați o valoare implicită pentru variabila dir
în codul de mai sus, ați începe prin setarea dir
la acea valoare implicită înainte de while
buclă.
O opțiune din linia de comandă nu poate accepta și nu accepta un argument.
Comentarii
- ok mulțumesc @Kusalananda, am presupus în mod greșit că getopts a luat fiecare – pentru începutul unui steag.