2015-10-05 203 views
1

我已经完成了向url发送请求并将它们保存在文件中的程序。该计划是这样的,并且可以正常使用:从命令行执行程序

require 'open-uri' 

n = gets.to_i 
out = gets.chomp 
output = File.open(out, "w") 

for i in 1..n 
    response = open('http://slowapi.com/delay/10').read 
    output << (response +"\n") 
    puts response 
end 

output.close 

我想修改它,这样我可以从命令行执行它。我必须像这样运行:

fle --test abc -n 300 -f output 

我该做什么?

+1

我不明白你确切想要什么,但告诉你你可以使用'irb'来运行你的代码的每一行 –

+0

英文写作时请使用英文标点符号。 – sawa

回答

0

第一步是将程序保存在文件中,在顶部添加#!/usr/bin/env ruby,然后在chmod +x yourfilename处添加以执行文件。

现在您可以从命令行运行您的脚本。

其次,您需要修改您的脚本来获取命令行参数。在Ruby中,命令行参数都存储在ARGV,所以像

ARGV.each do|a| 
    puts "Argument: #{a}" 
end 

可以检索命令行参数。

+0

@MaxWilliams我也相信,他们可以使用'#!/ usr/bin/env ruby​​',但是如果ruby是通过MRI或类似的方式安装的话,这是一个很好的评论。 – omninonsense

+0

走过'ARGV'绝对是老派。除非你绝对必要,否则不要这样做。相反,要利用Ruby内置的[Option Parser](http://ruby-doc.org/stdlib-2.2.3/libdoc/optparse/rdoc/index.html)类。 –

1

像这样的东西应该做的伎俩:

#!/usr/bin/env ruby 
require 'open-uri' 
require 'optparse' 

# Prepare the parser 
options = {} 
oparser = OptionParser.new do |opts| 
    opts.banner = "Usage: fle [options]" 
    opts.on('-t', '--test [STRING]', 'Test string') { |v| options[:test] = v } 
    opts.on('-n', '--count COUNT', 'Number of times to send request') { |v| options[:count] = v.to_i } 
    opts.on('-f', '--file FILE', 'Output file', :REQUIRED) { |v| options[:out_file] = v } 
end 

# Parse our options 
oparser.parse! ARGV 

# Check if required options have been filled, print help and exit otherwise. 
if options[:count].nil? || options[:out_file].nil? 
    $stderr.puts oparser.help 
    exit 1 
end 

File::open(options[:out_file], 'w') do |output| 
    options[:count].times do 
    response = open('http://slowapi.com/delay/10').read 
    output.puts response # Puts the response into the file 

    puts response # Puts the response to $stdout 
    end 
end 
+1

我正在研究windows。 – Skynet

+0

@Skynet然后你应该遵循[这些说明](http://windows.microsoft.com/en-us/windows/change-default-programs)关于如何注册'.rb'文件被ruby二进制打开。我不知道有任何其他方式。如果您不需要.rb后缀,则可能需要重新将您的脚本调用包装到一个bach文件中。我不是Windows用户,所以我不知道细节。 – omninonsense

+0

你能用我的代码的例子更新你的代码吗?我不完全明白,这是如何工作的。 – Skynet

1

这里是编写代码的更地道的方式:

require 'open-uri' 

n = gets.to_i 
out = gets.chomp 

File.open(out, 'w') do |fo| 

    n.times do 
    response = open('http://slowapi.com/delay/10').read 
    fo.puts response 
    puts response 
    end 

end 

它使用File.open与块,让Ruby来关闭文件块一旦退出。这比将文件句柄分配给变量并将其用于稍后的close文件要好得多。

如何处理从命令行传入的变量,因为在其他答案中处理了选项。

+0

代码示例中有一个小错字:'n.times'应该是'n次'。我试图编辑它,但它不会让我因为编辑小于6个字符。 :( – omninonsense

+0

@destielstarship,这是不好的,它不允许你编辑人们的代码被认为是不好的形式,相反你应该简单地在评论中指出它,可以调整拼写,语法和内容的清晰度,但代码和数据是神圣的 –

+0

哦,我不知道那个SO约定!我道歉。:-) – omninonsense