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 相关文章推荐
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
php基于str_pad实现卡号不足位数自动补0的方法
Nov 12 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
PHP进程通信基础之信号
Feb 19 PHP
微信开发之获取JSAPI TICKET
Jul 07 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
PHP echo()函数讲解
Feb 15 PHP
YII框架模块化处理操作示例
Apr 26 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中extract()函数的妙用分析
2012/07/11 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
javascript开发中因空格引发的错误
2010/11/08 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
python 运算符 供重载参考
2009/06/11 Python
python基础教程之循环介绍
2014/08/29 Python
Python CSV模块使用实例
2015/04/09 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
华为慧通面试题
2012/09/11 面试题
环保标语大全
2014/06/12 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
销售经理助理岗位职责
2015/04/13 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers