$ bash file.sh expected_arg -f optional_arg
Ho visto post che indirizzano usando $1
per afferrare il primo argomento
e post che affrontano l'utilizzo di getopts per l'analisi degli argomenti flag. Non ho visto un post che indirizzi entrambi.
Al momento sto accedendo a expected_arg
tramite $1
.
Non riesco a elaborare il -f
bandiera a tutti. Anche se ho anche questo nel mio script di test:
#!/bin/bash
dirname=$1
[[ -z $dirname ]] && echo "Project name required as an argument." && return
# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
case "${flag}" in
a) aflag='true' ;;
b) bflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true' ;;
*) error "Unexpected option ${flag}" ;;
esac
done
echo "$files"
echo "$HOME/Desktop/$dirname"
exit
Il terminale mostra:
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
A meno che Cambio l'ordine degli argomenti, come in:
bash file.sh -f optional_arg expected_arg
Quale output del terminale:
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
Quindi, naturalmente, -f viene elaborato come $1
, che non è quello che voglio. Ho bisogno di prendere il Expect_arg
Vincoli necessari:
- Devo consentire un numero variabile di flag (da nessuno a più). Pertanto, la posizione di Expect_arg varierà
- expected_arg è un must
- Preferirei evitare di dover usare un altro flag per analizzare Expect_arg (come in, voglio evitare di fare qualcosa come
$ bash test.sh -f file -d blah
)
Come posso soddisfare questi vincoli?
Risposta accettata:
Non importa. Ho trovato questo post:Utilizzo di getopts per analizzare le opzioni dopo un argomento non di opzione
che sostanzialmente dice che posso risolvere il mio problema semplicemente inserendo shift
dopo dirname=$1
Ciò consentirà di inserire gli argomenti come
$ bash file.sh expected_arg -f optional_arg