ruby - 如何正确解析不同数量的命令行参数

Ben*_*ett 5 ruby command-line arguments

n00b提问!这是问题:我正在创建一个至少需要3个参数的shell脚本:一个字符串,一个行号和至少一个文件.

我写了一个脚本,它将接受完全3个参数,但我不知道如何处理多个文件名参数.

这是我的代码的相关部分(跳过写回文件等):

#!/usr/bin/env ruby

the_string = ARGV[0] 
line_number = ARGV[1]
the_file = ARGV[2] 

def insert_script(str, line_n, file)
  f = file
  s = str
  ln = line_n.to_i

  if (File.file? f)
    read_in(f,ln,s)
  else 
    puts "false"
  end
end

def read_in(f,ln,s)
  lines = File.readlines(f)
  lines[ln] = s + "\n"
  return lines
end

# run it
puts insert_script(the_string, line_number, the_file)
Run Code Online (Sandbox Code Playgroud)

现在我知道编写一个可以遍历所有参数的块很容易:

ARGV.each do |a|
   puts a 
end
Run Code Online (Sandbox Code Playgroud)

但是我只需要将ARGV [2](第一个文件名)中的args循环到最后一个文件名.

我知道必须 - 至少 - 至少有一种简单的方法可以做到这一点,但我现在看不出它是什么!

在任何情况下 - 如果有人能指出我的教程或例子,我会非常高兴,我确信那里有很多 - 但我似乎无法找到它们.

谢谢

Mar*_*mas 7

你会考虑使用有用的宝石吗?Trollop非常适合命令行解析,因为它会自动为您提供帮助消息,长短命令行开关等.

require 'trollop'

opts = Trollop::options do
  opt :string, "The string", :type => :string
  opt :line, "line number", :type => :int
  opt :file, "file(s)", :type => :strings
end

p opts 
Run Code Online (Sandbox Code Playgroud)

当我将其命名为"commandline.rb"并运行它时:

$ ruby commandline.rb --string "foo bar" --line 3 --file foo.txt bar.txt

{:string=>"foo bar", :line=>3, :file=>["foo.txt", "bar.txt"], :help=>false, :string_given=>true, :line_given=>true, :file_given=>true}
Run Code Online (Sandbox Code Playgroud)


sar*_*old 5

如果修改ARGV数组以删除不再对作为文件名进行处理的元素ARGF,则可以将所有剩余元素视为文件名,并使用其迭代内容.

这是一个满口,一个小例子将更容易证明它:

argf.rb:

#!/usr/bin/ruby

str = ARGV.shift
line = ARGV.shift

ARGF.each do |f|
    puts f
end
Run Code Online (Sandbox Code Playgroud)
$ ./argf.rb one two argf.rb argf.rb 
#!/usr/bin/ruby

str = ARGV.shift
line = ARGV.shift

ARGF.each do |f|
    puts f
end
#!/usr/bin/ruby

str = ARGV.shift
line = ARGV.shift

ARGF.each do |f|
    puts f
end
$ 
Run Code Online (Sandbox Code Playgroud)

由于我在命令行上输入了两次文件名,因此打印到控制台的文件有两个副本.对于每次提及,它被打开并重复一次.argf.rbargf.rb

如果要将文件作为文件操作,而不是读取其内容,则只需修改ARGV数组,然后直接使用其余元素即可.