残念ながら、RubyはAWKなどの受け渡しメカニズムをサポートしていません。
> awk -v a=1 'BEGIN {print a}'
> 1
つまり、名前付きの値をスクリプトに直接渡すことはできません。
cmdオプションを使用すると役立つ場合があります。
> 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はすべてのcmd引数をARGV
配列に格納します。scriptname自体は$PROGRAM_NAME
変数を使用してキャプチャできます。
明らかな欠点は、値の順序に依存することです。
ブールスイッチのみが必要な場合-s
は、Rubyインタープリターのオプションを使用します。
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
--
スイッチに注意してください。そうしないと、Rubyが存在しないオプションについて文句を言う-agreed
ので、cmd呼び出しへのスイッチとして渡します。次の場合は必要ありません。
> ruby -s script_with_switches.rb -agreed
> So do I!
不利な点は、グローバル変数をいじって、論理的な真/偽の値しか持たないことです。
環境変数から値にアクセスできます。
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
ここに欠点があります。スクリプトを呼び出す前にすべての変数を設定するか(rubyプロセスのみ)、またはそれらをエクスポートする必要があります(BASHのようなシェル)。
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
後者の場合、データは同じシェルセッションのすべてのユーザーとすべてのサブプロセスで読み取り可能になるため、セキュリティに深刻な影響を与える可能性があります。
そして、少なくともgetoptlongとoptparseを使用してオプションパーサーを実装できます。
ハッキングハッピー!