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 11 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
分享一个漂亮的php验证码类
Sep 29 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
php利用imagemagick实现复古老照片效果实例
Feb 16 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
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
python实现堆栈与队列的方法
2015/01/15 Python
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python魔法方法-自定义序列详解
2016/07/21 Python
python基本语法练习实例
2017/09/19 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
PyCharm代码格式调整方法
2018/05/23 Python
Django框架 querySet功能解析
2019/09/04 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
python 基于wx实现音乐播放
2020/11/24 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
写出二分查找算法的两种实现
2013/05/13 面试题
如何进行Linux分区优化
2016/09/13 面试题
导游实习生自荐书
2014/01/28 职场文书
维修工先进事迹
2014/05/29 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
求职自我评价范文100字
2014/09/23 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB