PHP中通过getopt解析GNU C风格命令行选项


Posted in PHP onNovember 18, 2019

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

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

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

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

总结 options 使用规范

  • 短参数名,有一个限制,只能是一个char字符,只能1字节,不能超过1字节,比如上面的第四个命令的最后一个参数就不知道是一个参数还是三个参数了。
  • 短参数名用单个连字符(-)开始
  • 短参数可以一个-后面跟多个参数名
  • 长参数名,则是多字节的的,两个连字符(--)开始
  • 行参与实参之间,可以直接连接,也可以用空格隔开,还可以用等号连接
  • 参数分为没有值,必须传值,可选传值(也就是可传可不传)

在 PHP 中的使用

getopt ( string $options [, array $longopts [, int &$optind ]] ) : array

https://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.jpg
array (
 'O' => 'a.jpg',
)
php getopt.php -O a.jpg                 
array (
 'O' => 'a.jpg',
)
php getopt.php -O=a.jpg -dhV
array (
 'O' => 'a.jpg',
 'd' => false,
 'h' => false,
 'V' => false,
)
php getopt.php -O=a.jpg -dhV -vvv
array (
 '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 --debug
array (
 '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 -dhvvvV
array (
 'O' => 'a.jpg',
 'd' => false,
 'h' => false,
 'v' => 'vvV',
)

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
删除无限级目录与文件代码共享
Jul 12 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
PHP引用的调用方法分析
Apr 25 PHP
PHP 无限级分类
May 04 PHP
php中请求url的五种方法总结
Jul 13 PHP
php插件Xajax使用方法详解
Aug 31 PHP
详解提高使用Java反射的效率方法
Apr 29 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 PHP
php 多继承的几种常见实现方法示例
Nov 18 #PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 #PHP
PHP cookie与session会话基本用法实例分析
Nov 18 #PHP
php pdo连接数据库操作示例
Nov 18 #PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 #PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 #PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 #PHP
You might like
php实现的MySQL通用查询程序
2007/03/11 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
Gird事件机制初级读本
2007/03/10 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python 中的lambda函数介绍
2018/10/10 Python
对于Python深浅拷贝的理解
2019/07/29 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
应届毕业生求职自荐书
2014/01/03 职场文书
会议邀请书范文
2014/02/02 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
关于感恩的作文
2019/08/26 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle