如何解析ruby脚本中的用户输入

时间:2013-10-24 09:27:42

标签: ruby

我正在尝试学习ruby脚本。目前我正在创建一个脚本,该脚本应接受用户输入并执行如下操作:

Go to server1 and restart mysqld

以下是我的剧本:

#!/usr/bin/ruby

puts "on which environment you want to run the script?"
srenv = STDIN.gets.chomp()
puts "#{srenv}"

puts "Hi you have chosen to run the script on #{srenv}, now is it Cluster or not?"
srenvdl = STDIN.gets.chomp()
puts "#{srenvdl}"

if srenvdl == "y" 
    text = String.new
    File.open("cluster.txt") { |f|  text = f.read }
    words = text.split(/[^a-zA-Z1-9]/)
    puts "Now enter your services names:" 
    sernm = STDIN.gets.chomp()
    sernmw = sernm.split(/[^a-zA-Z1-9]/)
    for x in words
        for each in sernmw
            puts "Go to #{x} and restart #{each}!!"
        end 
    end
else 
    puts "Sorry now we are only supporting Clusters."
    exit
end

这是一个交互式脚本,它要求用户输入服务名称并从我想跳过的文件中读取集群服务器名称。此外,我无法在从文件中读取时跳过群集名称。

ruby script.rb cluster1:mysqld,nginx cluster2:memcache,sendmail

我有一个文件cluster.txt,我已经存储了集群服务器名称,如下所示:

cluster1:server1,server11,server111
cluster2:server2,server22,server222

现在我希望脚本应该返回结果,如下所示:

Go to server1 and restart mysqld
Go to server1 and restart nginx
Go to server11 and restart mysqld
Go to server11 and restart nginx
Go to server111 and restart mysqld
Go to server111 and restart nginx
Go to server2 and restart memcache
Go to server2 and restart sendmail
Go to server22 and restart memcache
Go to server22 and restart sendmail
Go to server222 and restart memcache
Go to server222 and restart sendmail

1 个答案:

答案 0 :(得分:2)

您可能会遇到需要将带有空格的参数传递给Ruby程序的情况。起初似乎是不可能的,因为shell分隔了空格上的参数。但是,有一个规定:双引号中的任何参数都不会分开。在将shell传递给Ruby程序之前,shell会删除双引号。以下示例将单个参数传递给test.rb Ruby脚本test1 test2。

$ ./test.rb "test1 test2"

使用命令行参数

在Ruby程序中,您可以使用ARGV特殊变量访问shell传递的任何命令行参数。 ARGV是一个Array变量,它以字符串形式保存shell传递的每个参数。以下程序遍历ARGV数组并打印出其内容。

#!/usr/bin/env ruby

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

以下是使用各种参数启动此脚本(保存为文件test.rb)的bash会话的摘录。

$ ./test.rb test1 test2 "three four"
Argument: test1
Argument: test2
Argument: three four