在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。

比如使用命令wget下载文件时,使用下面的一些方式来指定option都可以

wget http://mengkang.net/a.jpg -O b.jpgwget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -bwget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -bvd

我们整理下command line options的规则,首先参数分为短参数名和完整参数名,而且一些还有映射关系。比如我们使用wget时,-O对应--output-document。

总结 options 使用规范

● 短选项名,有一个限制,只能是一个char字符,只能1字节,不能超过1字节,比如上面的第四个命令的最后一个参数就不知道是一个选项还是三个选项了。

● 短选项名用单个连字符(-)开始

● 短选项可以一个-后面跟多个选项名

● 长选项和短选项可以有映射关系,也可以没有

● 长选项名,则是多字节的的,两个连字符(--)开始

● 选项与实参之间,可以直接连接,也可以用空格隔开,还可以用等号连接

● 但是短选项用等号连接值,等号会被视为值的一部分(但是在 php 里面却又兼容了这一点)

● 选项分为没有值,必须传值,可选传值(也就是可传可不传)

在 PHP 中的使用

getopt ( string $options [, array $longopts [, int &$optind ]] ) : arrayhttps://www.php.net/manual/zh/function.getopt.php

$options 短参数字符列表,参数字符后面用:标识必须传值;参数字符后面用::标识可选传值;只有参数字符表示该参数(或者说选项)不接受传值

$longopts 长参数由于是多字节,所以必须是数组,否则没法分隔。长参数同样遵循上面::、:规则

php里面缺少结构体的支撑,相比c的长选项的配置更加简洁,但也缺少了长短选项的映射关系配置。

$shortOpts = "O:Vv::dh";$longOpts = ["output-document:","version","verbose::", "debug", "help"]; $options = getopt($shortOpts, $longOpts);var_export($options);php getopt.php -Oa.jpg array (  'O' => 'a.jpg',)php getopt.php -O=a.jpgarray (  'O' => 'a.jpg',)php getopt.php -O a.jpg                                 array (  'O' => 'a.jpg',)php getopt.php -O=a.jpg -dhVarray (  'O' => 'a.jpg',  'd' => false,  'h' => false,  'V' => false,)php getopt.php -O=a.jpg -dhV -vvvarray (  'O' => 'a.jpg',  'd' => false,  'h' => false,  'V' => false,  'v' => 'vv',)

上面例子中我的短参数和长参数是对应的,但是没有数据结构来表示他们的对应关系(在C里面有option结构体来做这个对应关系的管理),所以我们两个都传的话,程序两个值会收到,然后我们自己判断短参数和长参数使用哪个。

php getopt.php -O=a.jpg -dhV -vvv --output-document b.jpg --debugarray (  'O' => 'a.jpg',  'd' => false,  'h' => false,  'V' => false,  'v' => 'vv',  'output-document' => 'b.jpg',  'debug' => false,)

这样写是不规范的,尽量避免这样的写法。

php getopt.php -O=a.jpg -dhVvvv  array (  'O' => 'a.jpg',  'd' => false,  'h' => false,  'V' => false,  'v' => 'vv',)php getopt.php -O=a.jpg -dhvvvVarray (  'O' => 'a.jpg',  'd' => false,  'h' => false,  'v' => 'vvV',)

总结了这个GNU C command line options 使用的套路,命令使用起来就更溜了,不会懵逼为什么linux下各种工具使用的案例写法“千奇百怪”了。

在C里面并不支持短选项和值用等号连接,在PHP里却是可以的,需要注意。

111

推荐:《PHP教程》

更多相关文章

  1. PHP编译参数configure配置详解
  2. 关于在php中使用curl发送get请求时参数传递问题的解析
  3. 【MySQL】mysql 5.7 sql_mode 参数解析
  4. 【MySQL】 explicit_defaults_for_timestamp 参数解析
  5. 我在一个构造方法中写了30个参数,老板看了想骂人
  6. Java线程池-当任务渐增时的处理-各个参数的含义
  7. JVM 常用配置参数(Java 8)
  8. 构造方法的参数太多,如何解决?
  9. 从代码的改进,看参数行为化与Lambda

随机推荐

  1. req.files.upload.length返回文件计数为
  2. js 学习之路9:运算符
  3. 如何添加文本描述以指向谷歌地图API
  4. 当我想使用Ember.js时,我应该选择哪个版本
  5. 如何修复一个页面网站的容器/正文宽度(htm
  6. 如何使用RequireJS扩展配置
  7. 如何在涉及css缩放时获取页面上的点击位
  8. CORS错误:请求标头字段预检响应中的Access
  9. 使数字成为另一个数字的因素(性能问题)
  10. 什么是一个很好的JS库,可以调整大小?