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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
php 获取可变函数参数的函数
Aug 26 PHP
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
php 利用socket发送HTTP请求(GET,POST)
Aug 24 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
Laravel多域名下字段验证的方法
Apr 04 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
PHP 采集心得技巧
2009/05/15 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
javascript 浏览器检测代码精简版
2010/03/04 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
Python自动连接ssh的方法
2015/03/07 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
Python3.9新特性详解
2020/10/10 Python
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
法律专业个人实习自我鉴定
2013/09/23 职场文书
运动会四百米广播稿
2014/01/19 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
文体活动总结范文
2014/05/05 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
优秀创业计划书分享
2019/07/19 职场文书