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 相关文章推荐
风格模板初级不完全修改教程
Oct 09 PHP
php实现网站插件机制的方法
Nov 10 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
全面解读PHP的人气开发框架Laravel
Oct 15 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
PHP _construct()函数讲解
Feb 03 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
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
js动态引入的四种方法
2018/05/05 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python数字类型math库原理解析
2020/03/02 Python
python raise的基本使用
2020/09/10 Python
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
资料员的岗位职责
2013/11/20 职场文书
高中军训感言1000字
2014/03/01 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
2015年项目工作总结
2015/04/29 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python