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生成月历代码
Jun 14 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
php eval函数用法总结
Oct 31 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
php获取文件后缀的9种方法
Mar 22 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
PHP判断是否是json字符串
Apr 01 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
15种PHP Encoder的比较
2007/04/17 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
如何编写jquery插件
2017/03/29 jQuery
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
Python编程之Re模块下的函数介绍
2017/10/28 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
公司JAVA开发面试题
2015/04/02 面试题
制定岗位职责的原则
2013/11/08 职场文书
车间调度岗位职责
2013/11/30 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
工程售后服务承诺书
2014/05/21 职场文书
师德承诺书2015
2015/04/28 职场文书
费城故事观后感
2015/06/10 职场文书
中秋节祝酒词
2015/08/12 职场文书
2016年父亲节寄语
2015/12/04 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python