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图片验证码代码
Mar 27 PHP
30 个很棒的PHP开源CMS内容管理系统小结
Oct 14 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
PHP连接access数据库
Mar 27 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 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通过COM使用ADODB的简单例子
2006/12/31 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
php命令行用法入门实例教程
2014/10/27 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
javascript实现简易计算器
2017/02/01 Javascript
Vue 仿百度搜索功能实现代码
2017/02/16 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
Python 12306抢火车票脚本
2018/02/07 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
python ftplib模块使用代码实例
2019/12/31 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
纠纷协议书
2014/04/16 职场文书
五心教育心得体会
2014/09/04 职场文书
技术股份合作协议书
2014/10/05 职场文书
送达通知书
2015/04/25 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python