分享一个php的冷知识 - ,从命令行参数列表中获取选项

用到的函数是getopt

说明

函数签名是这样的

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

解析传入脚本的选项,成功返回数组,解析失败返回false

参数

  • options 该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 比如,一个选项字符串 "x" 识别了一个选项 -x。 只允许 a-z、A-Z 和 0-9。
  • longopts 选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。 例如,长选项元素 "opt" 识别了一个选项 --opt。
  • optind 如果存在optind参数,则参数解析停止的索引将被写入此变量。

参数值

options 可能包含了以下元素: - 单独的字符(不接受值) - 后面跟随冒号的字符(此选项需要值) - 后面跟随两个冒号的字符(此选项的值可选)

optionslongopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项),而 options 需要一个字符串(每个字符是个选项)。

例子

说了这么多,我们举例说明吧

1. 基本用法

<?php
// Script 1.php
$options = getopt("h:p:d");
var_dump($options);
?>

命令行下测试看看

php 1.php -h 127.0.0.1 -p 8000 -d

以上例程会输出:

array(3) {["h"]=>string(9) "127.0.0.1"["p"]=>string(4) "8000"["d"]=>bool(false)
}

选项参数也可以中间不要空格

php 1.php -h 127.0.0.1 -p 8000 -d

php5.3之后还可以使用 "=" 作为 参数和值的分隔符

php 1.php -h=127.0.0.1 -p=8000 -d

2. 引入长选项

<?php
// Script 2.php
$shortopts  = "";       // 短选项 用字母字符串
$shortopts .= "h:";     // 必选选项 字母后面一个冒号
$shortopts .= "p::";    // 可选选项 字母后面两个冒号
$shortopts .= "vd";     // 无需值的选项 字母后面没有冒号$longopts  = array(     // 长选项 用单词的数组"host:",            // 必选选项 单词后面一个冒号"port::",           // 可选选项 单词后面两个冒号"version",          // 无需值的选项 单词后面没有冒号"debug",            // 无需值的选项 单词后面没有冒号
);$options = getopt($shortopts, $longopts);
var_dump($options);
?>

运行测试:

php 2.php -h127.0.0.1 -p8000 -d --host=127.0.0.1 --port=8000 --version --debug

输出:

array(7) {["h"]=>string(9) "127.0.0.1"["p"]=>string(4) "8000"["d"]=>bool(false)["host"]=>string(9) "127.0.0.1"["port"]=>string(4) "8000"["version"]=>bool(false)["debug"]=>bool(false)
}

3. 同一选项可以传递多次

运行测试:

php 2.php -d -d --version --debug --port=123 --port=234

输出:

array(4) {["d"]=>array(2) {     // 多个选项参数值以数组呈现[0]=>bool(false)[1]=>bool(false)}["version"]=>bool(false)["debug"]=>bool(false)["port"]=>array(2) {[0]=>string(3) "123"[1]=>string(3) "234"}
}

4. 使用 optind

// Script 3.php
$optind = null;
$opts = getopt('a:b:', [], $optind);
var_dump($argv);
var_dump($optind);
$pos_args = array_slice($argv, $optind);  // 从数组中取出一段
var_dump($pos_args);

运行测试:

php 3.php -a 1 -b 2 -- test

输出:

array(7) {[0]=>string(7) "cli.php"[1]=>string(2) "-a"[2]=>string(1) "1"[3]=>string(2) "-b"[4]=>string(1) "2"[5]=>string(2) "--"[6]=>string(4) "test"
}
int(6)      // $optind = 6
array(1) {[0]=>string(4) "test"
}

至此以后就可以写出漂亮优雅的cli程序了

参考

  • https://www.php.net/manual/zh/function.getopt.php

作者博客链接​metmoon.com

不出现php version网页_php冷知识 - 从命令行参数列表中获取选项相关推荐

  1. Windows命令行参数的知识(一)

    最近没事的时候,准备研究一下Windows命令行参数的知识,因为每次自己在操作电脑时总是效率太慢,如果能够了解Windows参数的一些知识,绝对能提高效率! 基本外部命令和内部命令 首先是基本的知识, ...

  2. hsweb提取页面查询参数_提取网页,登录情况填写规则,参数和值获取办法

    提取网页,登录情况填写规则,参数和值获取办法 (2013-12-06 21:11:52) 标签: 校园 点击采集选项卡左下角增加,弹出采集网站规则页面 如果以前添加过网站规则,且现在要增加的网站正好与 ...

  3. java冷知识:代码行数多少才算大项目?

    注:以下摘自:<软件工程概论> 郑人杰.殷人民编 java项目的大小衡量标准(以代码行作为计量标准的): 微型:只是一个人,甚至是半日工作在几天内完成的软件: 小型:一个人半年内完成的 2 ...

  4. linux学习笔记:1.基础知识和命令行基本操作

    初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...

  5. Node.JS基础知识之命令行窗口(Windows 的命令行窗口)

    dir : 显示当前目录下的所有文件 cd 目录名 :进入 指定的 目录下 . :标识当前目录 . . :表示上一级目录 md 目录名:新建一个文件夹 rd 目录名:删除一个文件夹 环境变量:Wind ...

  6. 从命令行使用 wget 调试网页错误

    调试 Web 服务器的一种方法是使用 wget 命令行程序,使用 -S 选项来显示所有的服务器响应.当使用 wget 进行调试时,我也喜欢使用 -O 选项将输出保存到一些临时文件中,以备以后需要查看其 ...

  7. [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助. 一.main()函数参数 通常我们在写主函数时都是vo ...

  8. php mysql 命令行模式_PHP 的命令行模式

    从版本 4.3.0 开始,PHP 提供了一种新类型的 SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Comm ...

  9. MySQL学习笔记-第一篇-基础知识与命令

    目录 1 登录命令 1.1 主机域名登录 1.2 主机ip登录 2 库命令 2.1 显示库 2.2 创建数据库 2.3 删除数据库 2.4 MySQL-8.新特性 3 表命令 3.1 创建数据表 3. ...

最新文章

  1. Java面试之Java基础上册(含答案)
  2. RecyclerView的滚动事件OnScrollListener研究
  3. 二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树
  4. 当社恐和社恐相亲时,场面会有多尴尬?
  5. 机械臂中的四元素转为旋转矩阵_雅克比矩阵(上)雅克比推导
  6. BitMEX联合创始人:以比特币为首的加密货币综合体是防范恶性通货膨胀的最佳对冲
  7. 测试开发之测试方法第一篇
  8. mysql 修改字段注释_MySQL数据库+命令大全,人手一份的实操攻略来啦
  9. mysql安装包提示选项_Windows操作系统安装MySQL解压版
  10. PCIE5.0英文版协议
  11. C4D模型工具—平面切割
  12. DDoS 攻击次数和攻击流量
  13. abp The value could not be converted to a GUID:
  14. 从战略到执行:业务领先模型 BLM 战略篇「市场洞察」
  15. java ps old gen_PSYoungGen /PSOldGen/PSPermGen区别
  16. 如何将图片制作成画中画特效
  17. 公众号商城开发和微信小程序商城开发有什么区别?
  18. 摇一摇 微信 浏览器
  19. 异次元发卡系统源码荔枝发卡V3.0
  20. python拟合非线性模型_python-绘制分段拟合到非线性数据

热门文章

  1. [算法]不使用*、/、+、-、%操作符求一个数的1/3
  2. 解决:vue.esm.js?efeb:591 [Vue warn]: Do not use built-in or reserved HTML elements as component id: me
  3. 注解驱动的 Spring cache 缓存介绍
  4. Hystix熔断解决雪崩问题
  5. 02-css的选择器
  6. android studio发布项目到github
  7. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)
  8. 微信开发学习日记(六):weiphp框架
  9. javascript获取事件源对象和产生事件的对象
  10. [讨论帖] 程序员如何赚外快?