专栏首页沈唁志PHP脚本指南-解析GNU C风格命令行选项

PHP脚本指南-解析GNU C风格命令行选项

2020年新年第一文,冲鸭~来说一下PHP脚本开发时如何去解析对应的命令行选项

获取脚本名称

我们先来说一下如何获取当前执行的脚本是什么,我们可以使用$argv来获取,$argv包含当运行于命令行下时传递给当前脚本的参数的数组

而第一个参数总是当前脚本的文件名,因此$argv[0]就是脚本文件名,这个在PHP手册当中也有说明

#script.php 
<?php
var_dump($argv);
$ php script.php 

array(1) {
  [0]=>
  string(10) "script.php"
}

这里需要注意的是$argv可以直接在单入口文件中使用,但是在类中就不可以啦,需要声明全局,比如

#script.php
<?php
class A
{
    public static function b()
    {
        //global $argv;
        //$argv = $GLOBALS['argv'];
        var_dump($argv);
        var_dump(isset($argv));
    }
}

A::b();

不声明为全局时结果就是nullfalse

获取命令行参数

在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,遍历这里就不说了,提供一个代码段,见GithubGist

我们来说一下PHP使用 getopt 这个函数来解析命令行选项,PHP手册地址

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

参数分为短参数名、完整参数名和optind,但是PHP缺少了长短选项的映射关系配置,比如-v--version-h--help

$options短参数字符列表,该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符-开头。只允许 a-z、A-Z 和 0-9

$longopts长参数字符列表,此数组中的每个元素会被作为选项字符串,匹配了以两个连字符--传入到脚本的选项。 长参数由于是多字节,所以必须是数组,否则没法分隔

以上的两个参数字符后用单独的字符表示不接受传值;后面跟随一个冒号:的字符表示此选项需要值(必填);后面跟随两个冒号::的字符表示此选项的值可选

下面我们来看一下具体代码示例

$ cat getopt.php
<?php
$shortOpts = "e:s::dh";
$longOpts = ["exec:","signal::", "debug", "help"];
$options = getopt($shortOpts, $longOpts);

var_export($options);

短参数:

$ php getopt.php -etest.php
array (
    'e' => 'test.php',
)

$ php getopt.php -e test.php
array (
  'e' => 'test.php',
)

$ php getopt.php -e"test.php"
array (
    'e' => 'test.php',
)

$ php getopt.php -e=test.php
array (
    'e' => 'test.php',
)

$ php getopt.php -e="test.php"
array (
    'e' => 'test.php',
)

$ php getopt.php -e="test.php" -dh
array (
    'e' => 'test.php',
    'd' => false,
    'h' => false,
)

$ php getopt.php -e="test.php" -dh -s15
array (
    'e' => 'test.php',
    'd' => false,
    'h' => false,
    's' => '15',
)

如果短参数和完整参数都传的话,程序两个值都会收到,需要我们自己判断短参数和完整参数使用哪个。比如:

$ php getopt.php -e=test.php --exec=index.php
array (
  'e' => 'test.php',
  'exec' => 'index.php',
)

完整参数:

$ php getopt.php --exec=index.php --debug --help --signal=1
array (
  'exec' => 'index.php',
  'debug' => false,
  'help' => false,
  'signal' => '1',
)

沈唁志,一个PHPer的成长之路! 任何个人或团体,未经允许禁止转载本文:《PHP脚本指南-解析GNU C风格命令行选项》,谢谢合作!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 解决修改 Linux 下的 PHP 环境变量不生效的方法

    这个问题出现服务器有多个 PHP 版本,php -v和phpinfo()显示两个不同的版本

    沈唁
  • 写给PHP开发者的五个建议

    沈唁
  • Swoole入门教程:CentOS7中安装PHP7安装Swoole扩展详细步骤

    使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务

    沈唁
  • 支付宝小程序获取 user_id(openid) ThinkPHP版

    生成应用私钥和应用公钥后,复制应用公钥,在 [ 开发中心—小程序应用—选择小程序-设置–开发设置–设置接口加密方式 ]

    WindrunnerMax
  • php报错502badgateway解决方法

    目前lnmp一键安装包比较多的问题就是502 Bad Gateway,大部分情况下原因是在安装php前,脚本中某些lib包可能没有安装上,造成php没有编译安装...

    砸漏
  • php & apache2 &操作系统之间的一些黑魔法

    做了一个CTF题目,遇到了一些有趣的东西,所以写了这篇文章记录了一下。 但是我却不明白造成这个问题的原因在哪里,所以不知道给文章起什么标题,就姑且叫这个非常宽泛...

    不知雨
  • php扩展模块安装

    叶瑾
  • Google SQL 注入搜索列表:2018最新版

    这是一个Google注入查询列表(傻瓜式),更新于2018年;根据一些关键字和URL结构,可批量查询出存在安全隐患的站点。

    HACK学习
  • Windows 8 IIS中配置PHP运行环境的方法

    这篇文章主要介绍了如何在Windows 8中通过iis8配置php运行环境,需要的朋友可以参考下

    习惯说一说
  • PHP获取HTTP body内容的方法总结

    有时候我们获取数据时需要根据Header中的格式来解析,比如上传一个json而不是一个文本。这里用到了 php输入|输出流 的概念。

    猿哥

扫码关注云+社区

领取腾讯云代金券