设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-06-24 14:12 所属栏目:121 来源:互联网
导读:在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。 比如使用命令wget下载文件时,使用下面的一些方式来指定option都可以 wget http://mengkang.net/a.jpg -O b.
  在 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下各种工具使用的案例写法“千奇百怪”了。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读