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 相关文章推荐
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
深入解析php中的foreach问题
Jun 30 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
php cookie 详解使用实例
Nov 03 PHP
php实现图片按比例截取的方法
Feb 06 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 PHP
Laravel 实现数据软删除功能
Aug 21 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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获取汉字首字母的函数
2013/11/07 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
php生成图片缩略图的方法
2015/04/07 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
document.createElement()用法
2013/03/13 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
jquery radio的取值_radio的选中_radio的重置方法
2016/09/20 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
浅析Python3爬虫登录模拟
2018/02/07 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
python pycharm的安装及其使用
2019/10/11 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
图书室管理制度
2014/01/19 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
个人工作表现自我评价
2015/03/06 职场文书
Python中json.dumps()函数的使用解析
2021/05/17 Python