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中养成7个面向对象的好习惯
Jan 28 PHP
深入解析Session是否必须依赖Cookie
Aug 02 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
PHP序列化操作方法分析
Sep 28 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
Oct 13 PHP
PHP数组操作简单案例分析
Oct 15 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 PHP
Laravel 实现密码重置功能
Feb 23 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 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
PHP4在Windows2000下的安装
2006/10/09 PHP
php对数组排序的简单实例
2013/12/25 PHP
php数据访问之增删改查操作
2016/05/09 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
基于JavaScript实现轮播图代码
2016/07/14 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
Angular之toDoList的实现代码示例
2017/12/02 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
python装饰器深入学习
2018/04/06 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
如何使用python写截屏小工具
2020/09/29 Python
python 如何设置守护进程
2020/10/29 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
征婚广告词
2014/03/17 职场文书
腾讯广告词
2014/03/19 职场文书
个人事迹材料范文
2014/12/29 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
golang生成并解析JSON
2022/04/14 Golang