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 相关文章推荐
利用discuz实现PHP大文件上传应用实例代码
Nov 14 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
PHP安全配置详细说明
Sep 26 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
php去掉文件前几行的方法
Jul 29 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
Dec 10 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
php中final关键字用法分析
Dec 07 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
php工具型代码之印章抠图
Jul 18 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中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python获取时间戳代码实例
2019/09/24 Python
python内置模块collections知识点总结
2019/12/19 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
C语言笔试题回忆
2015/04/02 面试题
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
教师队伍管理制度
2014/01/14 职场文书
初一体育教学反思
2014/01/29 职场文书
2014信息公开实施方案
2014/02/22 职场文书
合作协议书范文
2014/08/20 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
微信搭讪开场白
2015/05/28 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书