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 相关文章推荐
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
php 编写安全的代码时容易犯的错误小结
May 20 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
深入解析php中的foreach问题
Jun 30 PHP
PHP实现变色验证码实例
Jan 06 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
php实现给图片加灰色半透明效果的方法
Oct 20 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
Oct 11 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
php中isset与empty函数的困惑与用法分析
Jul 05 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
React组件的三种写法总结
2017/01/12 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
django连接mysql配置方法总结(推荐)
2018/08/18 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
python实现发送邮件
2021/03/02 Python
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
英语邀请函范文
2015/02/02 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
早安问候语大全
2015/11/10 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技