Je sais que je peux facilement obtenir des paramètres positionnés comme celui-ci dans bash:
$0
ou $1
Je veux pouvoir utiliser des options de drapeau comme celle-ci pour spécifier à quoi chaque paramètre est utilisé:
mysql -u user -h host
Quelle est la meilleure façon d'obtenir de la -u param
valeur et de la -h param
valeur par indicateur plutôt que par position?
Réponses:
C'est l'idiome que j'utilise habituellement:
Les points clés sont:
$#
est le nombre d'argumentsla source
--action*
et--output-dir*
?--action=[ACTION]
ainsi que le cas où quelqu'un tape--action [ACTION]
*)
vous cassez-vous là-bas, ne devriez-vous pas quitter ou ignorer la mauvaise option? En d'autres termes,-bad -o dir
la-o dir
pièce n'est jamais traitée.Cet exemple utilise la
getopts
commande intégrée de Bash et provient du guide de style Google Shell :Remarque: Si un caractère est suivi de deux points (par exemple
f:
), cette option devrait avoir un argument.Exemple d'utilisation:
./script -v -a -b -f filename
L'utilisation de getopts présente plusieurs avantages par rapport à la réponse acceptée:
-a -b -c
→-abc
)Cependant, un gros inconvénient est qu'il ne prend pas en charge les options longues, uniquement les options à un seul caractère.
la source
?) printf '\nUsage: %s: [-a] aflag [-b] bflag\n' $0; exit 2 ;;
getopt est votre ami .. un exemple simple:
Il devrait y avoir divers exemples dans votre répertoire / usr / bin.
la source
/usr/share/doc/util-linux/examples
, au moins sur les machines Ubuntu.Je pense que cela servirait d'exemple plus simple de ce que vous voulez réaliser. Il n'est pas nécessaire d'utiliser des outils externes. Les outils Bash intégrés peuvent faire le travail pour vous.
Cela vous permettra d'utiliser des indicateurs, donc peu importe l'ordre dans lequel vous passez les paramètres, vous obtiendrez le bon comportement.
Exemple :
Production :
Vous pouvez ajouter cette fonction à votre profil ou la placer dans un script.
Merci!
Modifier: enregistrez-le sous forme de fichier puis exécutez-le sous
yourfile.sh -last "Adios" -first "Hola"
la source
./hello.sh DOSOMETHING -last "Adios" -first "Hola"
return 1;
avec le dernier exemple de sortiescan only 'return' from a function or sourced script
sur macOS. Le passage àexit 1;
fonctionne comme prévu cependant.Une autre alternative serait d'utiliser quelque chose comme l'exemple ci-dessous qui vous permettrait d'utiliser des balises longues --image ou courtes -i et également autoriser les méthodes compilées -i = "example.jpg" ou -i example.jpg séparées pour passer des arguments .
la source
J'aime la réponse de Robert McMahan la meilleure ici car elle semble la plus facile à transformer en fichiers d'inclusion partageables pour n'importe lequel de vos scripts à utiliser. Mais il semble y avoir un défaut avec la ligne qui
if [[ -n ${variables[$argument_label]} ]]
lance le message, "variables: indice de mauvais tableau". Je n'ai pas le représentant pour commenter, et je doute que ce soit le bon «correctif», mais envelopper celaif
pour leif [[ -n $argument_label ]] ; then
nettoyer.Voici le code avec lequel je me suis retrouvé, si vous connaissez une meilleure façon, veuillez ajouter un commentaire à la réponse de Robert.
Inclure le fichier "flags-declares.sh"
Inclure le fichier "flags-arguments.sh"
Votre "script.sh"
la source
Si vous êtes familier avec Python argparse, et cela ne vous dérange pas d'appeler python pour analyser les arguments bash, il y a un morceau de code que j'ai trouvé très utile et super facile à utiliser appelé argparse-bash https://github.com/nhoffman/ argparse-bash
Exemple tiré de leur script example.sh:
la source
Je propose un TLDR simple :; exemple pour les non-initiés.
Créez un script bash appelé helloworld.sh
Vous pouvez ensuite passer un paramètre facultatif
-n
lors de l'exécution du script.Exécutez le script en tant que tel:
Production
Remarques
Si vous souhaitez utiliser plusieurs paramètres:
while getops "n:" arg: do
avec plus de paramètres tels quewhile getops "n:o:p:" arg: do
o) Option=$OPTARG
etp) Parameter=$OPTARG
la source
Enregistrez-le sous sample.sh et essayez d'exécuter
dans votre terminal.
la source
J'ai eu du mal à utiliser getopts avec plusieurs drapeaux, j'ai donc écrit ce code. Il utilise une variable modale pour détecter les indicateurs et utiliser ces indicateurs pour affecter des arguments aux variables.
Notez que si un indicateur ne doit pas avoir d'argument, autre chose que la définition de CURRENTFLAG peut être fait.
la source
Voici donc ma solution. Je voulais pouvoir gérer les drapeaux booléens sans trait d'union, avec un trait d'union, et avec deux tirets ainsi que l'affectation des paramètres / valeurs avec un et deux tirets.
Quelques références
declare
do$ bash -c "help declare"
.shift
do$ bash -c "help shift"
.la source