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

在 PHP 中,当咱们在获取命令行参数时,能够经过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。php

好比使用命令wget下载文件时,使用下面的一些方式来指定option均可以linux

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...
$options 短参数字符列表,参数字符后面用 :标识必须传值;参数字符后面用 ::标识可选传值;只有参数字符表示该参数(或者说选项)不接受传值
$longopts 长参数因为是多字节,因此必须是数组,不然无法分隔。长参数一样遵循上面 :::规则

php里面缺乏结构体的支撑,相比c的长选项的配置更加简洁,但也缺乏了长短选项的映射关系配置。bash

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

在C里面并不支持 短选项用等号链接,在PHP里倒是能够的,须要注意。
相关文章
相关标签/搜索