Sayangnya, Ruby tidak mendukung mekanisme passing seperti misalnya AWK:
> awk -v a=1 'BEGIN {print a}'
> 1
Ini berarti Anda tidak dapat meneruskan nilai yang disebutkan ke dalam skrip Anda secara langsung.
Menggunakan opsi cmd dapat membantu:
> 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 menyimpan semua argumen cmd dalam ARGV
array, nama script itu sendiri dapat ditangkap menggunakan $PROGRAM_NAME
variabel.
Kerugian yang jelas adalah bahwa Anda bergantung pada urutan nilai.
Jika Anda hanya perlu sakelar Boolean gunakan opsi -s
juru bahasa Ruby:
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Harap perhatikan --
sakelar, jika tidak, Ruby akan mengeluh tentang opsi yang tidak ada -agreed
, jadi serahkan sebagai sakelar ke cmd invokation Anda. Anda tidak membutuhkannya dalam kasus berikut:
> ruby -s script_with_switches.rb -agreed
> So do I!
Kerugiannya adalah bahwa Anda mengacaukan variabel global dan hanya memiliki nilai true / false logis.
Anda dapat mengakses nilai dari variabel lingkungan:
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Kerugian hadir di sini untuk, Anda harus mengatur semua variabel sebelum permintaan skrip (hanya untuk proses ruby Anda) atau untuk mengekspornya (kulit seperti BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
Dalam kasus terakhir, data Anda akan dapat dibaca untuk semua orang di sesi shell yang sama dan untuk semua subproses, yang bisa menjadi implikasi keamanan yang serius.
Dan setidaknya Anda dapat menerapkan parser pilihan menggunakan getoptlong dan optparse .
Selamat melakukan peretasan!