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循环到最后一个文件名.
我知道必须 - 至少 - 至少有一种简单的方法可以做到这一点,但我现在看不出它是什么!
在任何情况下 - 如果有人能指出我的教程或例子,我会非常高兴,我确信那里有很多 - 但我似乎无法找到它们.
谢谢
你会考虑使用有用的宝石吗?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)
如果修改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数组,然后直接使用其余元素即可.