PHP中通过getopt解析GNU C风格命令行选项
在PHP中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是GNUC-styleparserforcommandlineoptions。
比如使用命令wget下载文件时,使用下面的一些方式来指定option都可以
wgethttp://mengkang.net/a.jpg-Ob.jpg wgethttp://mengkang.net/a.jpg-O=b.jpg wgethttp://mengkang.net/a.jpg-Ob.jpg--tries=3-b wgethttp://mengkang.net/a.jpg-Ob.jpg--tries=3-bvd
我们整理下commandlineoptions的规则,首先参数分为短参数名和完整参数名,而且一些还有映射关系。比如我们使用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);
phpgetopt.php-Oa.jpg array( 'O'=>'a.jpg', ) phpgetopt.php-O=a.jpg array( 'O'=>'a.jpg', ) phpgetopt.php-Oa.jpg array( 'O'=>'a.jpg', ) phpgetopt.php-O=a.jpg-dhV array( 'O'=>'a.jpg', 'd'=>false, 'h'=>false, 'V'=>false, ) phpgetopt.php-O=a.jpg-dhV-vvv array( 'O'=>'a.jpg', 'd'=>false, 'h'=>false, 'V'=>false, 'v'=>'vv', )
上面例子中我的短参数和长参数是对应的,但是没有数据结构来表示他们的对应关系(在C里面有option结构体来做这个对应关系的管理),所以我们两个都传的话,程序两个值会收到,然后我们自己判断短参数和长参数使用哪个。
phpgetopt.php-O=a.jpg-dhV-vvv--output-documentb.jpg--debug array( 'O'=>'a.jpg', 'd'=>false, 'h'=>false, 'V'=>false, 'v'=>'vv', 'output-document'=>'b.jpg', 'debug'=>false, )
这样写是不规范的,尽量避免这样的写法。
phpgetopt.php-O=a.jpg-dhVvvv array( 'O'=>'a.jpg', 'd'=>false, 'h'=>false, 'V'=>false, 'v'=>'vv', ) phpgetopt.php-O=a.jpg-dhvvvV array( 'O'=>'a.jpg', 'd'=>false, 'h'=>false, 'v'=>'vvV', )
总结了这个GNUCcommandlineoptions使用的套路,命令使用起来就更溜了,不会懵逼为什么linux下各种工具使用的案例写法“千奇百怪”了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。