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 相关文章推荐
分页显示Oracle数据库记录的类之一
Oct 09 PHP
一个更简单的无限级分类菜单代码
Jan 16 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
PHP重定向与伪静态区别
Feb 19 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 26 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 PHP
PHP内存溢出优化代码详解
Feb 26 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
几种显示数据的方法的比较
2006/10/09 PHP
劣质的PHP代码简化
2010/02/08 PHP
php中socket通信机制实例详解
2015/01/03 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP 文件上传限制问题
2019/09/01 PHP
javascript 常用方法总结
2009/06/03 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
Vue仿支付宝支付功能
2018/05/25 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Python中itertools模块用法详解
2014/09/25 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
Python实现截屏的函数
2015/07/25 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
美德好少年主要事迹
2014/01/29 职场文书
年会搞笑主持词
2014/03/27 职场文书
政府门卫岗位职责
2014/04/29 职场文书
电教室标语
2014/06/20 职场文书
促销活动总结模板
2014/07/01 职场文书
六查六看六改心得体会
2014/10/14 职场文书
2014年护士长工作总结
2014/11/11 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
MySQL 分组查询的优化方法
2021/05/12 MySQL