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+mysql保存和输出文件
Oct 09 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
Mar 07 PHP
PHP入门教程之操作符与控制结构流程详解
Sep 09 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 PHP
关于laravel框架中的常用目录路径函数
Oct 23 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
PHP var关键字相关原理及使用实例解析
Jul 11 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合并数组中相同元素的方法
2014/11/13 PHP
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
Python fileinput模块使用实例
2015/06/03 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
python实现对变位词的判断方法
2020/04/05 Python
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
优秀员工个人的自我评价
2013/11/29 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
病危通知单
2015/04/17 职场文书
史上最牛辞职信
2015/05/13 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
Spring中的@Transactional的工作原理
2022/06/05 Java/Android