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中显示格式化的用户输入
Oct 09 PHP
php面向对象的方法重载两种版本比较
Sep 08 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 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实现文件下载功能的几个代码分享
2014/05/10 PHP
详解PHP队列的实现
2019/03/14 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
node.js中的Socket.IO使用实例
2014/11/04 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Windows下python3.7安装教程
2018/07/31 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
大学生职业生涯规划书参考模板
2014/03/05 职场文书
法律进学校实施方案
2014/03/15 职场文书
公司建议书怎么写
2014/05/15 职场文书
模具专业求职信
2014/06/26 职场文书
1000字打架检讨书
2014/11/03 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
颐和园导游词400字
2015/01/30 职场文书
人事行政主管岗位职责
2015/04/09 职场文书