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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。

在 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 -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 里面却又兼容了这一点)
  • 选项分为没有值,必须传值,可选传值(也就是可传可不传)

在 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下各种工具使用的案例写法“千奇百怪”了。

在C里面并不支持短选项用等号连接,在PHP里却是可以的,需要注意。
1

相关文章
|
22天前
|
域名解析 网络协议 安全
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
|
18天前
|
机器学习/深度学习 API PHP
PHP 7新特性深度解析与应用实践深入浅出:用深度学习识别手写数字
【8月更文挑战第27天】随着PHP 7的发布,这个广受欢迎的Web开发语言带来了许多令人兴奋的新特性。本文将深入探讨这些新特性,并展示如何在实际项目中利用它们来提升代码的性能和可维护性。无论你是PHP新手还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
|
4天前
|
编译器 PHP 开发者
PHP 7新特性深度解析
在这篇文章中,我们将深入探讨PHP 7带来的一系列新特性,包括性能提升、语法改进等方面。通过对比分析,我们将揭示这些变化如何影响开发者的编码实践和应用程序的性能优化。
|
5天前
|
编译器 PHP 开发者
PHP 8新特性解析与应用实践
PHP 8作为PHP语言的最新版本,带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 8中的JIT编译器、联合类型、匹配表达式等关键更新,并通过实例演示如何在项目中有效利用这些新工具,帮助开发者提升代码质量和执行效率。
|
18天前
|
编译器 PHP 开发者
PHP 7新特性深度解析与实践深入浅出PHP:构建你的第一个动态网页
【8月更文挑战第27天】本文将深入探讨PHP 7的新特性,包括性能提升、语法改进等,并通过代码示例展示如何在实际项目中应用这些新特性。同时,我们还将讨论如何优化现有项目以充分利用PHP 7的优势。让我们一起探索PHP 7的世界,提升开发效率和项目质量!
|
21天前
|
编译器 PHP 开发者
PHP 7新特性深度解析
【8月更文挑战第24天】本文将深入探讨PHP 7的新特性,包括性能提升、语法改进、错误处理等方面。我们将通过实际代码示例,展示这些新特性如何提高开发效率和程序性能。无论你是PHP新手还是资深开发者,这篇文章都将为你提供有价值的信息。
|
14天前
|
数据采集 PHP
PHP中实现简单爬虫与数据解析
【8月更文挑战第31天】在互联网的海洋里,爬虫技术如同一艘探索船,帮助我们搜集和理解信息。本文将带你通过PHP语言,轻松实现一个简单的网页内容抓取工具,并展示如何从抓取的数据中解析出有用信息。我们将一起航行在代码的波浪中,体验从无到有构建一个基本爬虫的过程。
|
应用服务中间件 PHP nginx
file not found. nginx php nginx 如何开启解析 PHP 的功能
<p>file not found. nginx php</p> <p>这个问题是你配置文件的问题:</p> <p><br></p> <p><br> 查看就是了不要管<br> nginx 如何开启解析 PHP 的功能?<br> # 成功安装后,创建 php-fpm.conf 配置文件,删除 nginx.conf 中“pass the PHP scripts to FastCGI
6969 0
|
4天前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
|
16天前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。

推荐镜像

更多