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 相关文章推荐
Look And Say 序列php实现代码
May 22 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
php登录超时检测功能实例详解
Mar 21 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
php 原生分页
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
献给php初学者(入门学习经验谈)
2010/10/12 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
php intval函数用法总结
2019/04/14 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
python中import学习备忘笔记
2017/01/24 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
岗位职责的构建方法
2014/02/01 职场文书
森林防火工作方案
2014/02/14 职场文书
西式结婚主持词
2014/03/14 职场文书
给校长的建议书400字
2014/05/15 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫