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模拟SQL Server的两个日期处理函数
Oct 09 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
php similar_text()函数的定义和用法
May 12 PHP
php菜单/评论数据递归分级算法的实现方法
Aug 01 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
dedecms模版制作使用方法
2007/04/03 PHP
php中var_export与var_dump的区别分析
2010/08/21 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
Python 使用with上下文实现计时功能
2018/03/09 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Django进阶之CSRF的解决
2018/08/01 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
民主生活会汇报材料
2014/12/15 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS