如何使用Ruby编写类似shell的脚本?

时间:2013-06-08 14:24:48

标签: ruby shell

我的任务是编写一个简单的Ruby脚本,它将执行以下操作。

从UNIX命令行执行时,它会向用户显示一个提示,在该提示下他应该可以运行某些命令,例如" dir"," { {1}}"或" help"。在" exit"用户应该返回Unix shell。

我没有要求解决方案;我想知道这个" shell"功能可以在Ruby中实现。如何向用户显示提示和解释命令。

我不需要带有参数的CLI脚本。我需要创建shell接口的东西。

5 个答案:

答案 0 :(得分:7)

只需几个简单的结构就可以轻松完成所需的程序类型。 我知道你不是在寻求解决方案,但我会给你一个骷髅来开始和玩弄:

#!/usr/bin/env ruby
def prnthelp
  puts "Hello sir, what would you like to do?"
  puts "1: dir"
  puts "2: exit"
end

def loop
  prnthelp
  case gets.chomp.to_i
    when 1 then puts "you chose dir!"
    when 2 then puts "you chose exit!"
      exit
  end
  loop
end

loop

无论如何,这是一个关于如何做到的简单示例,但可能评论中推荐的书更好。但这只是为了让你离开。

一些让你入门的命令是:

somevar = gets

这会获得用户输入。也许了解一些字符串方法来操纵这个输入可以对你有所帮助。 http://ruby-doc.org/core-2.0/String.html chomp将删除任何空格,to_i将其转换为整数。

执行Unix操作的一些命令:

system('ls -la') #=> outputs the output of that command
exit #=> exits the program

无论如何,如果你想要这样的东西,我认为调查http://www.codecademy.com/并不是一个坏主意,基本上他们会通过编写像这样的小脚本来教你Ruby。但是,它们可能不完全适应Unix命令,但用户输入和喜欢的东西肯定会被处理。


编辑:

正如所指出的那样,请在脚本的顶部使用它:

#!/usr/bin/env ruby

编辑:

chompchop的示例:

full_name = "My Name is Ravikanth\r\n" 
full_name.chop! # => "My Name is Ravikanth"

现在,如果您运行chop并且没有换行符:

puts full_name    #=> "My Name is Ravikanth"
full_name.chop!  #=> "My Name is Ravikant"

puts full_name       #=> "My Name is Ravikanth\r\n"

full_name.chomp!  #=> "My Name is Ravikanth"
full_name.chomp!  #=> "My Name is Ravikanth"

请参阅:“Ruby Chop vs Chomp

答案 1 :(得分:1)

这是一个非常基本的循环:

#!/user/bin/ruby
#
while true do
  print "$ "
  $stdout.flush
  inputs = gets.strip
  puts "got your input: #{inputs}"
  # Check for termination, like if they type in 'exit' or whatever...
  # Run "system" on inputs like 'dir' or whatever...
end

正如斯特凡在评论中提到的,这是一个很大的话题,有些情况会使这变得复杂。正如我所说,这是一个非常基本的例子。

答案 2 :(得分:1)

添加到目前为止发布的另外两个(有效)答案时要小心使用#!/usr/bin/ruby,因为ruby并不总是安装在那里。您可以改为使用它:

#!/usr/bin/env ruby

或者如果你想要警告:

#!/usr/bin/env ruby -w

这样,无论服务器和笔记本电脑上安装ruby的区别如何,您的脚本都能正常工作。

编辑:另外,一定要看看Thor和Rake。

http://whatisthor.com

http://rake.rubyforge.org

答案 3 :(得分:1)

使用 irb 。 我正在寻找 bash 的替代方案,并且正在考虑同样的思路......但最终选择 fish http://fishshell.com/

尽管如此,我正在考虑使用 irb 并沿着 irbtools 的路线前进:https://github.com/janlelis/irbtools

示例:

> irb
Welcome to IRB. You are using ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]. Have fun ;)
>> ls #=> ["bin", "share", "opt", "lib", "var", "etc", "src"]
>>

在任何情况下, irb 都是ruby shell。

答案 4 :(得分:-1)

查看内置支持的cliqr以构建自定义shell https://github.com/anshulverma/cliqr/