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

如何使用Ruby编写类似shell的脚本?,ruby,shell,Ruby,Shell,我的任务是编写一个简单的Ruby脚本,它将执行以下操作 从UNIX命令行执行时,它将向用户显示一个提示,提示用户应该能够运行某些命令,如“dir”、“help”或“exit”。在“退出”时,用户应返回Unix shell 我不是在寻求解决方案;我只是想知道如何在Ruby中实现这个“shell”功能。如何向用户显示提示和解释命令 我不需要接受参数的CLI脚本。我需要创建shell接口的东西。这里有一个非常基本的循环: #!/user/bin/ruby # while true do print

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

从UNIX命令行执行时,它将向用户显示一个提示,提示用户应该能够运行某些命令,如“
dir
”、“
help
”或“
exit
”。在“
退出
”时,用户应返回Unix shell

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


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

这里有一个非常基本的循环:

#!/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/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
这将获取用户输入。也许学习一些字符串方法来操作这些输入会对您有所帮助。
chomp
将删除所有空白,并将其转换为整数

执行Unix操作的一些命令:

system('ls -la') #=> outputs the output of that command
exit #=> exits the program
不管怎么说,如果你想要这种东西,我认为这不是一个坏主意,基本上他们通过编写这样的小脚本来教你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"
请参阅:“

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

#!/usr/bin/env ruby
或者,如果需要警告:

#!/usr/bin/env ruby -w
这样,无论在服务器和笔记本电脑上安装ruby的位置有何差异,您的脚本都能正常工作

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

使用内部评级法。 我在寻找bash的替代方案,并按照同样的思路思考。。。但最终选择了鱼:

尽管如此,我还是在考虑使用irb并遵循irb工具的思路:

例如:

> 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。

看看
cliqr
,它内置了对构建自定义shell的支持

ruby a.rb
fine@temuri,你一开始就有什么想法吗?例如,一个带有
打印“$”
的基本循环(不是
放入
,因为它隐式地添加了一个cr/lf)作为提示,而
获取
作为读取输入?然后,再次在基本级别,对从用户获取的字符串执行系统调用。在此基础上添加更多有趣的行为……这是一个巨大的主题,我可以推荐这本书:记住
chomp
获取的输入。在编写这类工具的代码时,未能做到这一点是巨大痛苦的根源。我更新并使用了“strip”来消除正面和背面的空白。“strip”会更好吗?要去除前面的空白,请使用
chomp
而不是
chop
。第一种是手术切除尾线末端。第二种方法是,如果找不到行尾,则不加选择地删除字符串中的最后一个字符。另外,
chop
不会删除“空白”,而是删除“\r\n”。空白包含行尾、制表符、空格和换行符/垂直制表符。
strip
可能是空白。解析命令时,通常不需要前导和尾随空格。再看看挤压(“”)
。我不认为雷神或雷克适合作为起点。它们面向命令行应用程序并执行系统配置和维护,这与OP的声明相反:
I不需要带参数的CLI脚本。我需要创建一个shell接口的东西。
如果你能用一个简单的例子说明如何使用它们,并且更有效,我想你应该添加一个。