15

这是我的代码:

if ARGV[0] == false
    puts "Usage: ./script.rb argument"
    exit
end
print "Yey we got an argument: " ARGV[0]

但是我不能让代码检查是否给出了 ARGV[0],我应该怎么做?

4

7 回答 7

32

检查它是否empty?(或检查它的长度):

if ARGV.empty?
  puts ...
  exit
end

考虑使用任何 Ruby 命令行参数解析器,例如OptionParser

于 2013-01-30T17:17:10.630 回答
7

处理位置参数(除了使用 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?
于 2013-01-30T17:22:54.473 回答
4

我意识到已经给出了一个很好的解决方案,但是没有人提到你的例子不起作用的真正原因。

您的示例代码的问题是,如果没有给出参数,ARGV[0]将返回nil,并且nil == false为假。nil是“假的”,但不等于假。你可以做的是:

unless ARGV[0]
  puts "Usage: ..."
  exit 1
end

这会起作用,因为这个陈述现在取决于虚假性,而不是与实际的相等性false

但是不要使用这段代码,如果你陈述你的实际意图,那就更清楚了,那就是你想知道是否有任何参数(而不是第一个参数是否是假的)。所以使用其他人建议的代码:

if ARGV.empty?
  puts "Usage..."
  exit 1
end
于 2013-11-15T14:11:16.780 回答
1

检查是否给出了 ARGV[0](或更多参数):

puts 'Usage: ...' if ARGV.length == 0

你也可以使用 ARGV.empty?(@DaveNewton 的回答)

于 2015-08-10T20:07:57.223 回答
0

可以查看长度ARGV。如果它有零个元素,则ARGV[0]没有给出。

于 2013-01-30T17:17:22.323 回答
0

我这样做并工作:

url = ARGV[0] 

if url.nil?
  puts "The shell script needs the arguments."
  exit
end
于 2018-09-28T16:07:52.190 回答
-2

这就是我所做的:

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
于 2014-01-24T15:22:47.417 回答