Analyser les arguments de ligne de commande dans un script Ruby
Je veux appeler un script Ruby à partir de la ligne de commande, et de les passer en paramètres qui sont des paires clé/valeur.
Appel en ligne de commande:
$ ruby my_script.rb --first_name=donald --last_name=knuth
my_script.rb:
puts args.first_name + args.last_name
Quel est le standard de Ruby façon de le faire? Dans d'autres langues, j'ai l'habitude d'utiliser une option analyseur. En Ruby, j'ai vu que nous avons ARGF.read
, mais cela ne semble pas fonctionner paires clé/valeur, comme dans cet exemple.
OptionParser semble prometteur, mais je ne peux pas dire si elle prend en charge cette affaire.
- ruby-toolbox.com/categories/CLI_Option_Parsers
- Si je ne me trompe pas, Highline semble des fonctions d'assistance à demander aux utilisateurs d'entrer des informations. Je voudrais donc utiliser Highline d'avoir ma console de dire
First Name:
et attendent leur entrée. Est-il une fonction particulière, je devrais être à la recherche à l'-t-il? - Il y a beaucoup de gemmes que vous pouvez choisir: ce site classe les bibliothèques et les trie par ordre de popularité. J'ai même écrit mon propre bijou, appelé
acclaim
, et il prend en charge la--option=value
de la syntaxe. Je n'ai pas eu le temps pour l'entretien de mes projets de logiciels libres, cependant. Vous devez choisir un mieux-pris en charge de la bibliothèque. - Voici un bon tutoriel sur les options de l'analyseur: dreamsyssoft.com/ruby-scripting-tutorial/...
Vous devez vous connecter pour publier un commentaire.
En fonction de la réponse par @MartinCortez voici un court one-off qui fait un hachage de paires clé/valeur, où les valeurs doivent être jointes avec un
=
signe. Il prend également en charge le drapeau des arguments sans valeurs:...ou sinon...
Appelé avec
-x=foo -h --jim=jam
il retourne{"x"=>"foo", "h"=>nil, "jim"=>"jam"}
de sorte que vous pouvez faire des choses comme:Bien qu'il existe plusieurs bibliothèques pour gérer ce—y compris
GetoptLong
fourni avec Ruby—personnellement, je préfère rouler mes propres. Voici le modèle que j'utilise, ce qui la rend raisonnablement générique, non lié à une utilisation spécifique de format, et suffisamment souple pour permettre mélangés les drapeaux, les options et les arguments requis dans différents ordres:ARGF
de lire les flux via les noms de fichiers/stdin, vous devez vous assurer de consommer les arguments deARGV
avant d'utiliserARGF.read
ou vous allez vous retrouver avec "No such file or directory" erreurs.Ruby intégré à OptionParser fait cela très bien. Combiner avec OpenStruct et vous êtes chez free:
options
contiendra les paramètres et les valeurs d'un algorithme de hachage.L'épargne et de l'exécution que sur la ligne de commande sans paramètre pour résultat:
Exécuter avec les paramètres:
Qui peut par exemple utiliser une table de Hachage pour contenir les options, mais vous pouvez utiliser un OpenStruct qui aura comme conséquence de l'utilisation, comme votre demande:
Elle même crée automatiquement votre
-h
ou--help
option:Vous pouvez utiliser des drapeaux de trop:
En cours d'exécution que par le biais de l'épreuve:
Il est facile d'ajouter inline explications sur les options de trop:
et:
OptionParser prend également en charge la conversion du paramètre à un type, comme un Entier ou d'un Tableau. Reportez-vous à la documentation pour plus d'exemples et d'informations.
Vous devriez également examiner les questions liées à la liste à droite:
Personnellement, je utiliser Docopt. C'est beaucoup plus clair, plus facile à gérer et plus facile à faire de la lecture.
Ont un look à en ligne Ruby mise en œuvre doc pour des exemples. L'utilisation est vraiment simple.
Code Ruby:
Puis de l'appel:
Et sans arguments :
Un peu de la norme Ruby Regexp dans
myscript.rb
:Et sur la ligne de commande:
$ ruby script.rb --first_name=donald --last_name=knuth
Produit:
$ donald knuth
=
pour lever l'ambiguïté entre-f foo
et-x -y bar
est un peu un non-starter pour usage du monde réel pour moi, mais c'est une belle rapide hack.s
?ARGV.join.to_s
?Une version améliorée qui gère les arguments qui ne sont pas les options, les arguments avec un paramètre, et
-a
ainsi que--a
.