$myscript.sh -host blah -user blah -pass blah I want to pass arguments into it.I'm used to doing $1, $2, $3....but I want to start naming them
5 Réponses :
Man getopt p>
Notez que getopts code> est une bash intégré tandis que
getopt code> est un utilitaire externe. Le premier fonctionne uniquement avec des options courtes (par exemple
-e code>) pendant que ce dernier fonctionnera également avec des longs (E.G.
-Foo code>). Notez qu'il existe des Problèmes avec ce dernier qui doit être adressé (versions ultérieures de
getopt code> avoir moins de problèmes).
Il y a beaucoup de façons d'analyser les arguments dans sh. GetOpt est bon. Voici un script simple qui analyse des choses à la main:
#!/bin/sh echo host = ${host:?host empty or unset} echo user = ${user?user not set} ...
En utilisant déclarer code> au lieu de
eval code> serait plus sécurisé.
En plus de la suggestion de @ Denniswilliamson, je suggère de supprimer | TR '\ 012' code>, comme il n'est pas nécessaire - la substitution de commande génère automatiquement toutes les nouvelles lignes de fin.
@ Mklement0 Je crois que je pensais que je pensais consciemment à penser à des nouvelles lignes internes, qui est impair compte que tenter de faire face à cela est une tentative d'ajouter une robustesse à une idée absurdement fragile. Il y a tellement de façons que ceci est fragile, c'est trop drôle.
Voici un exemple d'utilisation déclarer code> sans utiliser
sed code> (ou
eval code>):
déclarer "$ {1 # -}" = $ 2 < / code>. Notez que ni cette ni la technique de cette réponse ne traiteront de deux ou plusieurs traits d'union ni d'un traits d'union intégrés. En outre, les traits d'union ne sont pas autorisés dans les noms de variable Bash. Une étape séparée pourrait être ajoutée pour convertir des traits d'union aux souligneurs que sont i> autorisés:
var = $ {1 # -}; Déclarez "$ {var // - / _}" = "$ 2" code>
Voici un moyen simple de gérer les options longues et courtes: de Comment puis-je gérer des arguments de ligne de commande (options) à mon script facilement? p> p>
+1; Notez cependant que cela ne gérera pas les options i> compressées i>, telles que -vf code> pour représenter
-v -f code>.
d = (-_oo) merci! Testé et fonctionne sur / bin / sh code> (sans bash).
J'adopte au-dessus de William Pursell Exemple (avec Dennis Williamson conseil) pour les paramètres de ce format: script -param1 = valeur1 -param2 = value2 ...
Voici le code avec un analyseur d'arguments à une ligne (enregistrez-le dans le fichier 'Script'): P>
host = aaa user = bbb pass = ccc
Voici mon approche:
host="" user="" pass="" while [[ "$#" -gt 0 ]]; do case $1 in -h|--host) host="$2"; shift ;; -u|--user) user="$2"; shift ;; -p|--pass) pass="$2"; shift ;; *) echo "Unknown parameter passed: $1" ;; esac shift done
Envisagez de ne pas pariler d'options mais de transmettre des valeurs via l'environnement: par exemple "host = nom d'hôte utilisateur = moi myscript.sh"
dupliquer de Stackoverflow.com/questions/192249/... , qui a une très bonne réponse comparant le commutateur PURE-BASH
BASH CODE>,
GETOPTS CODE> (SHELL POSIX), et < Code> getopt code> (non recommandé sauf si c'est la version UTIL-Linux et que vous utilisez ses fonctionnalités non POSIX afin d'éviter les problèmes avec des arguments vides, etc.)