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 相关文章推荐
做一个有下拉功能的留言版
Oct 09 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
Dec 12 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
Laravel 中获取上一篇和下一篇数据
Jul 27 PHP
Yii rules常用规则示例
Mar 15 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
统计PHP目录中的文件数方法
Mar 05 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
提取HTML标签
2006/10/09 PHP
E路文章系统PHP
2006/12/11 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
php实现分页显示
2015/11/03 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
python属于跨平台语言码
2020/06/09 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
计算机软件个人的自荐信范文
2013/12/01 职场文书
总经理岗位职责范本
2014/02/02 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
2015年暑期见闻
2015/07/14 职场文书