PHP 中通过 getopt 解析 GNU C 风格命令行选项

简介: 在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。 比如使用命令wget下载文件时,使用下面的一些方式来指定option都可以 wget http://mengkang.

在 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 -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 里面却又兼容了这一点)
  • 选项分为没有值,必须传值,可选传值(也就是可传可不传)

在 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下各种工具使用的案例写法“千奇百怪”了。

在C里面并不支持短选项用等号连接,在PHP里却是可以的,需要注意。
111

目录
相关文章
|
9月前
|
Shell Linux PHP
PHP CLI的命令行模式的理解
PHP CLI的命令行模式的理解
57 0
|
JavaScript PHP
php +js 中多选项(复选)框的检测
在php中,想获得复选框的值,需要将复选框的name命名称数组的形式。 然后在$_GET["multiplayname"] 或 $_PUT["multiplayname"]获得其数值,但是如何判断用户是否选中其中的标单了,多选项目必须选择一项,否则不能提交表单! 在网上找了半天的资料,基本上是对多选框的name处理成数组,然后检测其checked值是否选中。
703 0
|
域名解析 Linux PHP
PHP 中通过 getopt 解析 GNU C 风格命令行选项
在 PHP 中,当我们在获取命令行参数时,可以通过遍历`$argv`来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。
637 0
PHP 中通过 getopt 解析 GNU C 风格命令行选项
|
安全 关系型数据库 PHP
|
PHP
php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
php.ini配置文件中的默认文件上传大小为2M, 默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max_filesize = 20M。
2078 0
|
Web App开发 Shell 测试技术
|
关系型数据库 Shell 测试技术
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 、PHP7.0、Apache服务器 PHP框架:ThinkPHP框架(3.
1855 0

推荐镜像

更多