น่าเสียดายที่ 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
อาร์เรย์ชื่อสคริปต์สามารถถูกจับได้โดยใช้$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
มีข้อเสียอยู่ที่นี่คุณต้องตั้งค่าตัวแปรทั้งหมดก่อนที่จะเรียกใช้สคริปต์ (สำหรับกระบวนการทับทิมของคุณ) หรือส่งออก (เชลล์เช่น BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
ในกรณีหลังข้อมูลของคุณจะสามารถอ่านได้สำหรับทุกคนในเชลล์เซสชั่นเดียวกันและสำหรับกระบวนการย่อยทั้งหมดซึ่งอาจส่งผลต่อความปลอดภัยอย่างรุนแรง
และอย่างน้อยคุณสามารถดำเนินการแยกวิเคราะห์โดยใช้getoptlongและoptparse
แฮ็คมีความสุข!