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自定义函数之递归删除文件及目录
Aug 08 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
php中随机函数mt_rand()与rand()性能对比分析
Dec 01 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
PHP编写daemon process详解及实例代码
Sep 30 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
PHP重载基础知识回顾
Sep 10 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的无限分类实现想法~
2007/01/02 PHP
PHP连接access数据库
2008/03/27 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP扩展开发入门教程
2015/02/26 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
酒店应聘自荐信
2013/11/09 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
水毁工程实施方案
2014/04/01 职场文书
事业单位考核材料
2014/05/21 职场文书
装修施工安全责任书
2014/07/24 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python