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 相关文章推荐
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
php中如何执行linux命令详解
Nov 06 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
php快速导入大量数据的实例方法
Sep 23 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实用小技巧之调用录像的方法
Dec 05 #PHP
You might like
PHP内存缓存功能memcached示例
2016/10/19 PHP
php strftime函数的详细用法
2018/06/21 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Python3的socket使用方法详解
2020/02/18 Python
Python Django view 两种return的实现方式
2020/03/16 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
Django celery异步任务实现代码示例
2020/11/26 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
四种会话跟踪技术
2015/05/20 面试题
高级工程师岗位职责
2013/12/15 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
科技节口号
2014/06/19 职场文书
六一亲子活动总结
2014/07/01 职场文书
刑事撤诉申请书
2015/05/18 职场文书
法院答辩状格式
2015/05/22 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
德生2P3收音机开箱评测
2022/04/30 无线电
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js