Malheureusement, Ruby ne supporte pas un tel mécanisme de passage comme par exemple AWK :
> awk -v a=1 'BEGIN {print a}'
> 1
Cela signifie que vous ne pouvez pas passer des valeurs nommées dans votre script directement.
L'utilisation des options cmd peut aider :
> ruby script.rb val_0 val_1 val_2
# script.rb
puts ARGV[0] # => val_0
puts ARGV[1] # => val_1
puts ARGV[2] # => val_2
Ruby stocke tous les arguments cmd dans le fichier ARGV
le nom de script lui-même peut être capturé à l'aide de la fonction $PROGRAM_NAME
variable.
L'inconvénient évident est que vous dépendez de l'ordre des valeurs.
Si vous n'avez besoin que de commutateurs booléens, utilisez l'option -s
de l'interpréteur Ruby :
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Veuillez noter que le --
sinon Ruby se plaindra d'une option inexistante. -agreed
Il faut donc le passer en tant que commutateur à votre invocation cmd. Vous n'en avez pas besoin dans le cas suivant :
> ruby -s script_with_switches.rb -agreed
> So do I!
L'inconvénient, c'est que vous vous embrouillez avec les variables globales et que vous n'avez que des valeurs logiques vrai/faux.
Vous pouvez accéder aux valeurs des variables d'environnement :
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Les inconvénients sont présents ici aussi, vous devez définir toutes les variables avant l'invocation de script (seulement pour votre processus ruby) ou les exporter (shells comme BASH) :
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
Dans ce dernier cas, vos données seront lisibles par tous les participants à la même session du shell et par tous les sous-processus, ce qui peut avoir de graves conséquences sur la sécurité.
Et au moins vous pouvez implémenter un analyseur d'options en utilisant getoptlong y optparse .
Bon piratage !
2 votes
Vous pouvez envisager d'éditer cette question populaire en un véritable question .