PHP中通过getopt解析GNU C风格命令行选项_php实例_脚本之家

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

PHP基础之脚本传参

通常PHP都做http方式请求了,可以使用GET or
POST方式接收参数,有些时候需要在shell命令下把PHP当作脚本执行,比如定时任务。这就涉及到在shell命令下如何给php传参的问题,通常有三种方式传参。

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

1. 使用$argv or $argc参数接收

#$argv, 所有参数的数组,默认第一个为文件名,若要取到第一个参数则:$argv[1]
#$argc, 所有参数总和,相当于 count($argv)
wget http://mengkang.net/a.jpg -O b.jpgwget http://mengkang.net/a.jpg -O=b.jpgwget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -bwget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -bvd

2. 使用getopt函数

  • 函数:

    array getopt ( string $options [, array $longopts ] )

  • 参数:

    • options
      该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。
      比如,一个选项字符串 “x” 识别了一个选项 -x。 只允许 a-z、A-Z 和
      0-9。
    • longopts 选项数组。
      此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(–)传入到脚本的选项。
      例如,长选项元素 “opt” 识别了一个选项 –opt。

    • options 可能包含了以下元素:

      • 单独的字符(不接受值)
      • 后面跟随冒号的字符(此选项需要值)
      • 后面跟随两个冒号的字符(此选项的值可选)

    $opt = getopt(“s::p:m:habc”,array(‘debug:’,’again::’, ‘help’));

新澳门萄京娱乐场,我们整理下command line
options的规则,首先参数分为短参数名和完整参数名,而且一些还有映射关系。比如我们使用wget时,-O对应–output-document。

3. 提示用户输入

  • 直接读取标准输入数据,写入标准输出

    • STDOUT 标准输出
    • STDIN 标准输入

    fwrite(STDOUT,’请输入您的博客名:’);
    echo ‘您输入的信息是:’.fgets(STDIN);

总结 options 使用规范

短参数名,有一个限制,只能是一个char字符,只能1字节,不能超过1字节,比如上面的第四个命令的最后一个参数就不知道是一个参数还是三个参数了。
短参数名用单个连字符开始 短参数可以一个-后面跟多个参数名
长参数名,则是多字节的的,两个连字符开始
行参与实参之间,可以直接连接,也可以用空格隔开,还可以用等号连接
参数分为没有值,必须传值,可选传值

在 PHP 中的使用

getopt ( string $options [, array $longopts [, int &$optind ]] ) : array

$options
短参数字符列表,参数字符后面用:标识必须传值;参数字符后面用::标识可选传值;只有参数字符表示该参数不接受传值

$longopts
长参数由于是多字节,所以必须是数组,否则没法分隔。长参数同样遵循上面::、:规则

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

$shortOpts = "O:Vv::dh";$longOpts = ["output-document:","version","verbose::", "debug", "help"]; $options = getopt($shortOpts, $longOpts);var_export;

php getopt.php -Oa.jpg array php getopt.php -O=a.jpgarray php getopt.php -O a.jpg array php getopt.php -O=a.jpg -dhVarray ( 'O' => 'a.jpg', 'd' => false, 'h' => false, 'V' => false,)php getopt.php -O=a.jpg -dhV -vvvarray ( '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 --debugarray ( '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 -dhvvvVarray ( 'O' => 'a.jpg', 'd' => false, 'h' => false, 'v' => 'vvV',)

总结了这个GNU C command line options
使用的套路,命令使用起来就更溜了,不会懵逼为什么linux下各种工具使用的案例写法“千奇百怪”了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

发表评论

电子邮件地址不会被公开。 必填项已用*标注