Thật không may, Ruby không hỗ trợ cơ chế vượt qua như AWK:
> awk -v a=1 'BEGIN {print a}'
> 1
Điều đó có nghĩa là bạn không thể chuyển trực tiếp các giá trị được đặt tên vào tập lệnh của mình.
Sử dụng tùy chọn cmd có thể giúp:
> 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 lưu trữ tất cả các đối số cmd trong ARGV
mảng, chính scriptname có thể được ghi lại bằng $PROGRAM_NAME
biến.
Nhược điểm rõ ràng là bạn phụ thuộc vào thứ tự của các giá trị.
Nếu bạn chỉ cần các công tắc Boolean, hãy sử dụng tùy chọn -s
trình thông dịch Ruby:
> ruby -s -e 'puts "So do I!" if $agreed' -- -agreed
> So do I!
Vui lòng lưu ý công --
tắc, nếu không, Ruby sẽ phàn nàn về tùy chọn không tồn tại -agreed
, vì vậy hãy chuyển nó dưới dạng chuyển đổi sang lệnh gọi cmd của bạn. Bạn không cần nó trong trường hợp sau:
> ruby -s script_with_switches.rb -agreed
> So do I!
Nhược điểm là bạn gây rối với các biến toàn cục và chỉ có các giá trị logic / sai logic.
Bạn có thể truy cập các giá trị từ các biến môi trường:
> FIRST_NAME='Andy Warhol' ruby -e 'puts ENV["FIRST_NAME"]'
> Andy Warhol
Hạn chế có mặt ở đây, bạn phải đặt tất cả các biến trước khi gọi tập lệnh (chỉ dành cho quy trình ruby của bạn) hoặc xuất chúng (shell như BASH):
> export FIRST_NAME='Andy Warhol'
> ruby -e 'puts ENV["FIRST_NAME"]'
Trong trường hợp sau, dữ liệu của bạn sẽ có thể đọc được cho mọi người trong cùng một phiên shell và cho tất cả các quy trình con, đây có thể là một hàm ý bảo mật nghiêm trọng.
Và ít nhất bạn có thể thực hiện một trình phân tích cú pháp tùy chọn bằng cách sử dụng getoptlong và optparse .
Chúc mừng hack!