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 22 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 PHP
PHP array 的加法操作代码
Jul 24 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
Oct 31 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
php实现SAE上使用storage上传与下载文件的方法
Jun 29 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
Laravel 实现添加多语言提示信息
Oct 25 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
详解PHP用substr函数截取字符串中的某部分
2016/12/03 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
javascript实现计算器功能
2020/03/30 Javascript
Python实现的Excel文件读写类
2015/07/30 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Python如何省略括号方法详解
2020/03/21 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
通过实例解析python and和or使用方法
2020/11/14 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
招商经理岗位职责
2013/11/16 职场文书
签约仪式策划方案
2014/06/02 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
2014年优秀党员材料
2014/12/18 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
教师理论学习心得体会
2016/01/21 职场文书