我的任务是编写一个简单的 Ruby 脚本来执行以下操作。
在从 UNIX 命令行执行时,它会向用户显示一个提示,在该提示下他应该能够运行某些命令,例如“ dir
”、“ help
”或“ exit
”。在“ exit
”之后,用户应该返回到 Unix shell。
我不是在寻求解决方案;我只想知道如何在 Ruby 中实现这个“shell”功能。您如何向用户提供提示和解释命令。
我不需要带参数的 CLI 脚本。我需要一些可以创建 shell 接口的东西。
您需要的程序类型只需几个简单的结构即可轻松制作。我知道你不是在寻求解决方案,但我只会给你一个框架来开始和玩弄:
#!/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 ”
这是一个非常基本的循环:
#!/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 在评论中提到的,这是一个巨大的话题,并且有些场景会使这变得复杂。正如我所说,这是一个非常基本的例子。
添加到目前为止发布的其他两个(有效)答案,请谨慎使用#!/usr/bin/ruby
,因为 ruby 并不总是安装在那里。您可以改用它:
#!/usr/bin/env ruby
或者,如果您想要警告:
#!/usr/bin/env ruby -w
这样一来,无论您的服务器和笔记本电脑上安装 ruby 的位置有何不同,您的脚本都可以正常工作。
编辑:另外,一定要看看雷神和雷克。
使用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是红宝石外壳。
看看cliqr
哪个内置支持构建自定义外壳https://github.com/anshulverma/cliqr/