$ bash file.sh expected_arg -f optional_arg
J'ai vu des messages dont l'adresse utilise $1
saisir le premier argument
et publie cette adresse en utilisant getopts pour analyser les arguments des indicateurs. Je n'ai pas vu d'article traitant des deux.
J'accède actuellement à expected_arg
via $1
.
Je ne peux pas traiter le -f
drapeau du tout. Même si j'ai aussi ceci dans mon script de 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
Le terminal affiche :
Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah
Sauf Je change l'ordre des arguments, comme dans :
bash file.sh -f optional_arg expected_arg
Ce que le terminal affiche :
Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f
Donc naturellement, -f est traité comme $1
, ce qui n'est pas ce que je veux. J'ai besoin de saisir l'attendu_arg
Contraintes nécessaires :
- Je dois autoriser un nombre variable de drapeaux (de aucun à plusieurs). Par conséquent, la position de expect_arg variera
- expected_arg est indispensable
- Je préférerais éviter d'avoir à utiliser un autre indicateur pour analyser l'argument attendu_arg (comme dans, je veux éviter de faire quelque chose comme
$ bash test.sh -f file -d blah
)
Comment puis-je satisfaire ces contraintes ?
Réponse acceptée :
Ça ne fait rien. J'ai trouvé ce post :Utiliser getopts pour analyser les options après un argument non-option
qui dit essentiellement que je peux résoudre mon problème simplement en plaçant shift
après dirname=$1
Ce qui permettra d'entrer les arguments comme
$ bash file.sh expected_arg -f optional_arg