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执行速度全攻略(上)
Oct 09 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
memcache命令启动参数中文解释
Jan 13 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
PHP简单的MVC框架实现方法
Dec 01 PHP
twig模板常用语句实例小结
Feb 04 PHP
orm获取关联表里的属性值
Apr 17 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 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类
2006/07/15 PHP
php获取地址栏信息的代码
2008/10/08 PHP
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
布同 统计英文单词的个数的python代码
2011/03/13 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python中使用print输出中文的方法
2018/07/16 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
大学生求职中的自我评价
2013/10/01 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
30岁生日感言
2014/01/25 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
目标责任书格式
2014/07/28 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
个人党性分析材料
2014/12/19 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
小学运动会入场口号
2015/12/24 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP