这是我的代码:
if ARGV[0] == false
puts "Usage: ./script.rb argument"
exit
end
print "Yey we got an argument: " ARGV[0]
但是我不能让代码检查是否给出了 ARGV[0],我应该怎么做?
这是我的代码:
if ARGV[0] == false
puts "Usage: ./script.rb argument"
exit
end
print "Yey we got an argument: " ARGV[0]
但是我不能让代码检查是否给出了 ARGV[0],我应该怎么做?
处理位置参数(除了使用 gem 来做)的最简单方法是一次一个地关闭它们:
arg1 = ARGV.shift
arg2 = ARGV.shift
缺少的参数将为零。让我们利用它给 arg2 一个默认值:
arg1 = ARGV.shift
arg2 = ARGV.shift || 'default value goes here'
检查所需的参数很简单:
raise "missing argument" unless arg1
也很容易看出是否提供了太多参数:
raise "too many arguments" unless ARGV.empty?
我意识到已经给出了一个很好的解决方案,但是没有人提到你的例子不起作用的真正原因。
您的示例代码的问题是,如果没有给出参数,ARGV[0]
将返回nil
,并且nil == false
为假。nil
是“假的”,但不等于假。你可以做的是:
unless ARGV[0]
puts "Usage: ..."
exit 1
end
这会起作用,因为这个陈述现在取决于虚假性,而不是与实际的相等性false
。
但是不要使用这段代码,如果你陈述你的实际意图,那就更清楚了,那就是你想知道是否有任何参数(而不是第一个参数是否是假的)。所以使用其他人建议的代码:
if ARGV.empty?
puts "Usage..."
exit 1
end
检查是否给出了 ARGV[0](或更多参数):
puts 'Usage: ...' if ARGV.length == 0
你也可以使用 ARGV.empty?(@DaveNewton 的回答)
可以查看长度ARGV
。如果它有零个元素,则ARGV[0]
没有给出。
我这样做并工作:
url = ARGV[0]
if url.nil?
puts "The shell script needs the arguments."
exit
end
这就是我所做的:
a = 'defaultvalue' if (a = ARGV.shift).nil?
其他人建议这样做:
a = ARGV.shift || 'defaultvalue'
这是错误的,因为任何错误值都会导致defaultvalue
被分配,例如:
args=[false]; a=args.shift||true; # a has final value true when it should be false