12
votes

Analyse des arguments de script shell

$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 

2 commentaires

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 , GETOPTS (SHELL POSIX), et < Code> getopt (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.)


5 Réponses :


10
votes

1 commentaires

Notez que getopts est une bash intégré tandis que getopt est un utilitaire externe. Le premier fonctionne uniquement avec des options courtes (par exemple -e ) pendant que ce dernier fonctionnera également avec des longs (E.G. -Foo ). Notez qu'il existe des Problèmes avec ce dernier qui doit être adressé (versions ultérieures de getopt avoir moins de problèmes).



15
votes

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


4 commentaires

En utilisant déclarer au lieu de eval serait plus sécurisé.


En plus de la suggestion de @ Denniswilliamson, je suggère de supprimer | TR '\ 012' , 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 sans utiliser sed (ou eval ): 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 autorisés: var = $ {1 # -}; Déclarez "$ {var // - / _}" = "$ 2"



11
votes

Voici un moyen simple de gérer les options longues et courtes: xxx

de Comment puis-je gérer des arguments de ligne de commande (options) à mon script facilement?


2 commentaires

+1; Notez cependant que cela ne gérera pas les options compressées , telles que -vf pour représenter -v -f .


d = (-_oo) merci! Testé et fonctionne sur / bin / sh (sans bash).



1
votes

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


0 commentaires

0
votes

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


0 commentaires