2013-10-24 5 views
1

Я пытаюсь изучить рубиновые скрипты. В настоящее время я создаю скрипт, который должен принимать пользовательский ввод и сделать какое-то действие, как показано ниже:Как разобрать пользовательские входы в скрипте 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 

Это интерактивный сценарий, и он просит пользователя ввести услугу name и читает имена серверов кластера из файла, который я хочу пропустить. Кроме того, я не могу пропустить имя кластера во время чтения из файла.

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

У меня есть файл anoter 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

На самом деле я не хочу интерактивного, во-вторых, он не может пропустить clustername во время чтения из файла cluster.txt. – linuxnewbee

ответ

2

Вы можете столкнуться с ситуацией, в которой вам необходимо передать аргумент с пробелом в нем в программу Ruby. Сначала это кажется невозможным, так как оболочка разделяет аргументы на пробелы. Однако для этого есть условие: любые аргументы в двойных кавычках не будут разделены. Двойные кавычки удаляются оболочкой перед передачей ее в программу Ruby. Следующий пример передает один аргумент скрипту ruby ​​test.rb, test1 test2.

$ ./test.rb "test1 test2" 

Использование командной строки Аргументы

В своих программах на Ruby, вы можете получить доступ аргументы командной строки, передаваемые оболочкой со специальной переменной ARGV. ARGV - это переменная Array, которая содержит в качестве строк каждый аргумент, передаваемый оболочкой. Следующая программа выполняет итерацию по массиву ARGV и выводит ее содержимое.

#!/usr/bin/env ruby 

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

Ниже приводится выдержка из Баш сессии запускающего этот скрипт (сохраненный как файл test.rb) с различными аргументами.

$ ./test.rb test1 test2 "three four" 
Argument: test1 
Argument: test2 
Argument: three four 
Смежные вопросы