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 相关文章推荐
使用PHPMyAdmin修复论坛数据库的图文方法
Jan 09 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
11个PHPer必须要了解的编程规范
Sep 22 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
Yii2隐藏frontend/web和backend/web的方法
Dec 12 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP文件后缀不强制为.php方法
Mar 31 PHP
PHP新手指南
Apr 01 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实用小技巧之调用录像的方法
Dec 05 #PHP
You might like
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
python实现探测socket和web服务示例
2014/03/28 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
python验证身份证信息实例代码
2019/05/06 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
运动员获奖感言
2014/08/15 职场文书
授权收款委托书范本
2014/10/10 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
父亲去世追悼词
2015/06/23 职场文书