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 获取百度的热词数据的代码
Feb 18 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
php实现点击可刷新验证码
Nov 07 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
php之可变变量的实例详解
Sep 12 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
php基础知识:控制结构
2006/12/13 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
详解python eval函数的妙用
2017/11/16 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
Python数据存储之 h5py详解
2019/12/26 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
基本款天堂:Everlane
2017/05/13 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
小学英语课后反思
2014/04/26 职场文书
创卫工作总结2015
2015/04/22 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
MySQL创建高性能索引的全步骤
2021/05/02 MySQL