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下10件你也许并不了解的事情
Sep 11 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
May 24 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
分析PHP中单双引号的误区和双引号小隐患
Jul 19 PHP
yii2简单使用less代替css示例
Mar 10 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 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实用小技巧之调用录像的方法
Dec 05 #PHP
You might like
mysql时区问题
2008/03/26 PHP
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
php生成zip文件类实例
2015/04/07 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
Python中super函数的用法
2017/11/17 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
公司道歉信范文
2014/01/09 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
教师专业自荐信
2014/05/31 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
学校党支部承诺书
2015/04/30 职场文书
迎新年主持词
2015/07/06 职场文书
实习感想范文
2015/08/10 职场文书