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 相关文章推荐
mysql建立外键
Nov 25 PHP
php中文本操作的类
Mar 17 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
php读取csv文件并输出的方法
Mar 14 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 PHP
PHP _construct()函数讲解
Feb 03 PHP
php-fpm中max_children的配置
Mar 15 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 常用的系统函数
2017/02/07 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
php strftime函数的详细用法
2018/06/21 PHP
读jQuery之五(取DOM元素)
2011/06/20 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
python中的多重继承实例讲解
2014/09/28 Python
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python for循环与range函数的使用详解
2019/03/23 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
优秀学生干部推荐材料
2014/02/03 职场文书
小学信息技术教学反思
2014/02/10 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
2014年村委会工作总结
2014/11/24 职场文书
英文感谢信范文
2015/01/21 职场文书
英语邀请函范文
2015/02/02 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL