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 相关文章推荐
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
PHP生成随机密码类分享
Jun 25 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
php redis实现文章发布系统(用户投票系统)
Mar 04 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
PHP 时间处理类Carbon
May 20 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
桌面中心(三)修改数据库
2006/10/09 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
Prototype String对象 学习
2009/07/19 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python函数参数*args**kwargs用法实例
2013/12/04 Python
python类继承用法实例分析
2014/10/10 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
护理专业毕业生推荐信
2013/10/31 职场文书
影视艺术学院毕业生自荐信
2013/11/13 职场文书
会议室标语
2014/06/21 职场文书
先进员工获奖感言
2014/08/14 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android