您是否考慮過使用optparse?它帶有Ruby標準庫。
下面是使用optparse爲您的示例中的參數執行選項解析的類。它處理錯誤,打印出它的用法,如果「-h」或者「--help」,並給出了封裝解析參數到一個很好的類,你可以繞過:
require 'optparse'
class Arguments
POSITIONAL_ARGS = %w(p1sclrv template p1sclrvplv db_user_limits)
attr_reader :mission
attr_reader :save_path
attr_reader :what_to_skip
attr_reader *POSITIONAL_ARGS
def initialize(argv)
option_parser.parse!(argv)
POSITIONAL_ARGS.each do |positional_arg|
value = argv.shift
instance_variable_set("@#{positional_arg}", value)
raise OptionParser::MissingArgument, positional_arg.to_s unless value
end
raise OptionParser::NeedlessArgument, argv.first unless argv.empty?
rescue OptionParser::ParseError => e
puts e
puts option_parser
exit(1)
end
private
def option_parser
OptionParser.new do |op|
op.banner += ' ' + POSITIONAL_ARGS.join(' ')
op.on('--save=PATH', 'Save to PATH') do |value|
@save_path = value
end
op.on('--skip=WHAT', 'Skip WHAT') do |value|
@what_to_skip = value
end
op.on('--mission=NAME', 'Do mission NAME') do |value|
@mission = value
end
end
end
end
在實際使用中,通過ARGV它:
args = Arguments.new(ARGV)
下面是一個例子傳遞一個虛構的ARGV和打印解析參數:
args = Arguments.new(%w(--skip=FOO alpha bravo charley delta))
p args.p1sclrv # => "alpha"
p args.template # => "bravo"
p args.p1sclrvplv # => "charley"
p args.db_user_limits # => "delta"
p args.mission # => nil
p args.save_path # => nil
p args.what_to_skip # => "FOO"
這裏的幫助是什麼樣子:
Arguments.new(%w(--help))
# => Usage: foo [options] p1sclrv template p1sclrvplv db_user_limits
# => --save=PATH Save to PATH
# => --skip=WHAT Skip WHAT
# => --mission=NAME Do mission NAME
感謝您的介紹optparse ..我沒有看過它之前。我的挑戰是腳本最終會變成非編碼器類型,所以我需要儘可能保持語法上的簡單。運營商不喜歡運行他們不瞭解的代碼,但他們也不經常關心學習編碼。 –
+1示例 – knut
@Reed,使用該約束,消除所有開關參數並僅使用位置參數。然後它只是'foo = ARGV.shift','bar = ARGV.shift'等等。你寫的是代碼,就像使用optparse一樣。 「非編碼器」也沒有機會。對於這個問題,如果你的「非編碼員」熟悉shell腳本,那麼腳本應該用shell腳本編寫。 –