cum se analizează corect steagurile și argumentele scriptului shell folosind getopts

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-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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *