4

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

在从 UNIX 命令行执行时,它会向用户显示一个提示,在该提示下他应该能够运行某些命令,例如“ dir”、“ help”或“ exit”。在“ exit”之后,用户应该返回到 Unix shell。

我不是在寻求解决方案;我只想知道如何在 Ruby 中实现这个“shell”功能。您如何向用户提供提示和解释命令。

我不需要带参数的 CLI 脚本。我需要一些可以创建 shell 接口的东西。

4

5 回答 5

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

编辑:

chomp与的例子chop

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

于 2013-06-08T14:42:12.330 回答
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

正如 Stefan 在评论中提到的,这是一个巨大的话题,并且有些场景会使这变得复杂。正如我所说,这是一个非常基本的例子。

于 2013-06-08T14:32:40.413 回答
1

添加到目前为止发布的其他两个(有效)答案,请谨慎使用#!/usr/bin/ruby,因为 ruby​​ 并不总是安装在那里。您可以改用它:

#!/usr/bin/env ruby

或者,如果您想要警告:

#!/usr/bin/env ruby -w

这样一来,无论您的服务器和笔记本电脑上安装 ruby​​ 的位置有何不同,您的脚本都可以正常工作。

编辑:另外,一定要看看雷神和雷克。

http://whatisthor.com

http://rake.rubyforge.org

于 2013-06-08T14:47:35.460 回答
1

使用irb我正在寻找bash的替代方案,并沿着同样的思路思考......但最终选择了: 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是红宝石外壳。

于 2013-06-08T17:50:59.630 回答
-1

看看cliqr哪个内置支持构建自定义外壳https://github.com/anshulverma/cliqr/

于 2015-06-26T17:57:52.457 回答