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中的integer类型使用分析
Jul 27 PHP
php生成略缩图代码
Jul 16 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
May 20 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 PHP
一文搞懂php的垃圾回收机制
Jun 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实现微信小程序授权登录功能(实现流程)
Nov 13 #PHP
You might like
PHP自动重命名文件实现方法
2014/11/04 PHP
PHP递归的三种常用方式
2019/02/28 PHP
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
python实现保存网页到本地示例
2014/03/16 Python
Python使用turtule画五角星的方法
2015/07/09 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
python学生管理系统的实现
2020/04/05 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
《燕子》教学反思
2014/02/18 职场文书
客户接待方案
2014/02/26 职场文书
求职面试个人自我评价
2014/02/28 职场文书
挂靠协议书
2015/01/27 职场文书
百家讲坛观后感
2015/06/12 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
JS数组去重详情
2021/11/07 Javascript
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL