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 相关文章推荐
15种PHP Encoder的比较
Mar 06 PHP
PHP与MySQL开发的8个技巧小结
Dec 17 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php文件夹的创建与删除方法
Jan 24 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
php workerman定时任务的实现代码
Dec 23 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
easy_install python包安装管理工具介绍
2013/02/10 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Django model select的多种用法详解
2019/07/16 Python
python中的列表与元组的使用
2019/08/08 Python
Python如何实现定时器功能
2020/05/28 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
北京某公司的.net笔试题
2014/03/20 面试题
超市端午节活动方案
2014/01/23 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
产品售后服务承诺书
2014/05/21 职场文书
工作作风建设心得体会
2014/10/22 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
英文自荐信范文
2015/03/25 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android