以ruby方式解析命令行选项(optionparser)

Ruby配备了一个强大而灵活的工具来解析命令行选项OptionParser。一旦您学会了如何使用它,您就再也不会回到手动查看ARGV了。OptionParser有许多特性,使它对Ruby程序员非常有吸引力。如果您曾经在Ruby或C中手工解析过选项,或者使用getoptlong C函数解析过选项,您将看到这些更改中的一些是多么受欢迎。...

Ruby配备了一个强大而灵活的工具来解析命令行选项OptionParser。一旦您学会了如何使用它,您就再也不会回到手动查看ARGV了。OptionParser有许多特性,使它对Ruby程序员非常有吸引力。如果您曾经在Ruby或C中手工解析过选项,或者使用getoptlong C函数解析过选项,您将看到这些更改中的一些是多么受欢迎。

Cloud computing desk
  • OptionParser是干的。您只需在脚本中编写一次命令行开关、其参数、遇到时要运行的代码以及命令行开关描述。OptionParser将根据此描述自动为您生成帮助屏幕,并根据其描述推断有关参数的所有信息。例如,它将知道--file[file]选项是可选的,并且只接受一个参数。另外,它将知道--[-no]-verbose实际上是两个选项,并且将接受这两种形式。
  • OptionParser将自动将选项转换为特定类。如果该选项采用整数,则可以将命令行上传递的任何字符串转换为整数。这减少了解析命令行选项所涉及的一些繁琐工作。
  • 一切都很包容。所有选项都位于同一位置,选项的效果与选项的定义一致。如果必须添加、更改选项,或者某人只是想看看他们在做什么,那么只有一个地方可以查看。解析命令行后,单个哈希或OpenStruct将保存结果。

够了,给我看一些代码

下面是一个如何使用OptionParser的简单示例。它不使用任何高级功能,只使用基本功能。有三个选项,其中一个接受一个参数。所有选项都是强制性的。有-v/--verbose和-q/--quick选项,以及-l/--logfile选项。此外,该脚本获取独立于选项的文件列表。

#!/usr/bin/env ruby # A script that will pretend to resize a number of images require 'optparse' # This hash will hold all of the options # parsed from the command-line by # OptionParser. options = {} optparse = OptionParser.new do|opts| # Set a banner, displayed at the top # of the help screen. opts.banner = "Usage: optparse1.rb [options] file1 file2 ..." # Define the options, and what they do options[:verbose] = false opts.on( '-v', '--verbose', 'Output more information' ) do options[:verbose] = true end options[:quick] = false opts.on( '-q', '--quick', 'Perform the task quickly' ) do options[:quick] = true end options[:logfile] = nil opts.on( '-l', '--logfile FILE', 'Write log to FILE' ) do|file| options[:logfile] = file end # This displays the help screen, all programs are # assumed to have this option. opts.on( '-h', '--help', 'Display this screen' ) do puts opts exit end end # Parse the command-line. Remember there are two forms # of the parse method. The 'parse' method simply parses # ARGV, while the 'parse!' method parses ARGV and removes # any options found there, as well as any parameters for # the options. What's left is the list of files to resize. optparse.parse! puts "Being verbose" if options[:verbose] puts "Being quick" if options[:quick] puts "Logging to file #{options[:logfile]}" if options[:logfile] ARGV.each do|f| puts "Resizing image #{f}..." sleep 0.5 end

检查代码

首先,需要optpass库。记住,这不是宝石。它与Ruby一起提供,因此不需要在OptPass之前安装gem或rubygems。

这个脚本中有两个有趣的对象。第一个是选项,在最上面的范围中声明。这是一个简单的空散列。定义选项后,它们会将默认值写入此哈希。例如,此脚本的默认行为是不详细,因此选项[:verbose]设置为false。在命令行中遇到选项时,它们将更改选项中的值以反映其效果。例如,当遇到-v/--verbose时,它会将true分配给选项[:verbose]。

第二个有趣的对象是optpass。这是OptionParser对象本身。构造此对象时,将向其传递一个块。此块在构建期间运行,将在内部数据结构中构建一个选项列表,并准备好解析所有内容。所有的魔法都是在这个街区发生的。您可以在此处定义所有选项。

定义选项

每个选项都遵循相同的模式。首先将默认值写入哈希。这将在构造OptionParser后立即发生。接下来,调用on方法,该方法定义了选项本身。这种方法有几种形式,但这里只使用一种。其他表单允许您定义自动类型转换和选项限制的值集。这里使用的三个参数是选项的短格式、长格式和描述。

on方法将从长形式中推断出许多东西。一件事是威尔推断出任何参数的存在。如果选项上存在任何参数,它会将其作为参数传递给块。

如果在命令行中遇到该选项,则会运行传递给on方法的块。在这里,这些块没有什么作用,它们只是在选项散列中设置值。还可以做更多的工作,比如检查引用的文件是否存在,等等。如果有任何错误,可以从这些块抛出异常。

最后,解析命令行。这是通过调用parse来实现的!方法在OptionParser对象上。这个方法实际上有两种形式,parse和parse!。正如带有感叹号的版本所暗示的那样,它具有破坏性。它不仅解析命令行,还将删除从ARGV中找到的任何选项。这是一件重要的事情,它只会在ARGV中的选项之后留下提供的文件列表。

  • 发表于 2021-10-10 08:24
  • 阅读 ( 220 )
  • 分类:编程

你可能感兴趣的文章

做一个壁挂式仪表板破折号.io和一个树莓派

... 然后你需要一个树莓圆周率显示器,安装方式,和一个框架。如果你想得到幻想,你可以挂一个树莓皮触摸屏和框架的皮在其中与阴影框。或者,任何旧显示器和一个额外的框架或木材,使一个就足够了。有很多...

  • 发布于 2021-03-14 19:14
  • 阅读 ( 196 )

jekyll vs.gatsbyjs:哪个静态网站构建者构建了最好的网站?

... 使用命令行安装这两个静态网站生成器非常简单。 ...

  • 发布于 2021-03-19 02:43
  • 阅读 ( 443 )

如何使用click在python中创建自己的命令行程序

... 让我们看一下点击操作。从命令行运行脚本,但按如下方式传入total参数: ...

  • 发布于 2021-03-23 13:56
  • 阅读 ( 267 )

如何在linux上管理ip地址:查找、设置和更改

... 如果您希望返回以通过DHCP自动分配IP地址,请按以下方式设置文件: ...

  • 发布于 2021-03-24 17:34
  • 阅读 ( 255 )

使用静态站点生成器快速构建网站

...SSG的基本编程语言。例如,如果不支持Ruby,我们的Jekyll命令将无法运行,因此您无法构建您的站点。但是,在自己的计算机上安装必备组件应该没有问题,除非您没有管理权限。 ...

  • 发布于 2021-03-25 19:23
  • 阅读 ( 306 )

如何在linux上创建手册页

...则编写一个并手动**宏是一项艰巨的工作。创建一个正确解析并看起来正确的手册页的行为可以超越您的目标,从而提供命令的简明、但彻底的描述。 你应该把注意力集中在你的内容上,而不是和一组晦涩难懂的宏作斗争。 相...

  • 发布于 2021-04-01 21:08
  • 阅读 ( 269 )

如何在linux上使用dig命令

...名用于任何连接到internet的程序时,您的本地路由器无法解析它(除非它是从以前的请求缓存的)。因此,您的路由器查询您的互联网服务提供商(ISP)的DNS服务器,或任何其他您已配置您的系统使用。这些被称为DNS前体服务器...

  • 发布于 2021-04-02 10:09
  • 阅读 ( 210 )

如何使用journalctl读取linux系统日志

...录 对争议并不陌生,systemd系统和****器在收集系统日志的方式上引入了一个重大的改变。根据创建日志的服务或守护程序,日志通常位于文件系统中的不同位置。但他们都有一个共同点。它们是纯文本文件。 使用systemd,所有系...

  • 发布于 2021-04-02 17:06
  • 阅读 ( 173 )

如何使用linux type命令

...以让我们更好地理解Linux或其他类似Unix的操作系统的构造方式。在引擎盖下面看一眼可以让我们成为一个更明智的司机。 我们向命令行发出的指令属于以下类别之一: 别名:一种用户(或系统)定义的命令,它使其它命令序列...

  • 发布于 2021-04-03 10:23
  • 阅读 ( 195 )

如何在linux上使用最后一个命令

...令时找出登录的用户。 last -R -p now 这是一个有点冗长的方式来实现什么可以完成使用世界卫生组织的命令。 相关:如何在Linux中确定当前用户帐户 lastb命令 lastb命令值得一提。它从名为btmp的日志中读取数据。关于这个日志名...

  • 发布于 2021-04-03 12:45
  • 阅读 ( 138 )
hugecapt
hugecapt

0 篇文章

相关推荐