php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数
在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法
1.直接使用argv变量数组。
2.使用$_SERVER['argv']全局变量来获取,其值和1是一样的。
3.使用getopt方法
#getopt方法格式
array getopt ( string $options [, array $longopts ] )
options:该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 选项字符串只允许 a-z、A-Z 和 0-9。
示例:print_r(getopt('a:b::c'));将会得到一个数组,其后面的冒号规则如下:
•单独的字符(不接受值)
•后面跟随冒号的字符(此选项需要值)
•后面跟随两个冒号的字符(此选项的值可选)
所以:getopt('a:b::c')即表示a是需要的值,b是可选值,c是不要的值(传了也置空)
注:选项的值是字符串后的第一个参数。它不介意值之前是否有空格。
PHP程序示例:
<?php
print_r(getopt('a:b::c'));
echo "\n--------------------\n";
入参命令及显示结果:你会发现也有一些现象:
[root@123 ~]# php a.php -a=1 -b=5 -c=6 -d=4
Array
(
[a] => 1
[b] => 5
[c] =>
)
--------------------
#结果:遇到不接受的c后,后面的参数都不会再处理。 [root@123 ~]# php a.php -a 1 -b=5 -c=6 -d=4
Array
(
[a] => 1
[b] => 5
[c] =>
)
--------------------
[root@123 ~]# php a.php -a 1 -b5 -c=6 -d=4
Array
(
[a] => 1
[b] => 5
[c] =>
)
--------------------
[root@123 ~]# php a.php -a 1 -b 5 -c=6 -d=4
Array
(
[a] => 1
[b] =>
)
--------------------
#为什么上面的-b后面用空格会导致b取不到结果?文档明明写着=和空格都是可以的。
#我试验感觉有这么一个规律:最后一个值不能和参数有空格。
写到这里我真感觉这不是一个什么好方法!真够麻烦的,而且这个单字符传参没可读性,不过还是提一下,我在使用的时候发现命令行里还可以传递数组的,比如你可以传递-a=1后,再接着传一个-a=5,则得到的-a自动变成一个二维数组,包含两个值。不过觉得意义不大。接下来再看longopts:
longopts:选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。因为options只允许单个字符,而这在程序中没有什么可读性,当然不可取。所以有必要使用longopts。
options 和 longopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项)
PHP程序示例:
<?php
print_r(getopt('',array('type:')));
结果示例:
[root@123 ~]# php a.php --id 101 --type=1 --age=4
Array
(
[id] => 101
[type] => 1
[age] =>
)
--------------------
[root@123 ~]# php a.php --id 101 --type 1 --age=4
Array
(
[id] => 101
[type] =>
)
--------------------
#仍是一样:最后一个值不能和参数有空格。
真心觉得longopts一样也是一个麻烦的东西,真不知道getopt有什么卖点,既然$argv能取到值那么在PHP里使用一个方法一下子就得到键值不就行了。于是我试着用这么一个方法:
<?php
function getClientArgs()
{
global $argv;
array_shift($argv);
$args = array();
array_walk($argv, function($v ,$k) use(&$args){
@list($key, $value) = @explode('=', $v);
$args[$key] = $value;
});
return $args;
}
$args = getClientArgs();
print_r($args);
然后在命令行中执行:显示如下,这样是不是更简洁明了?
[root@123 ~]# php test2.php id=4 type=1001 age=25
Array
(
[id] => 4
[type] => 1001
[age] => 25
)
例子:

php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数的更多相关文章
- 在Linux命令行中使用计算器的5个命令
大家好,我是良许. 在使用 Linux 时,我们有时会需要做一些计算,那么我们就可能需要用到计算器.在 Linux 命令行里,有许多计算器工具,这些命令行计算器可以让我们执行科学计算.财务计算或者一些 ...
- 在 Linux/windows下 命令行中使用和执行 PHP 代码[交互式php]
[注释]在ubuntu下,升级php到7.1版本,虽然提示的是Interactive mode enabled, 但实际上可以直接书写命令,和interactive shell效果一样. 一:wind ...
- 命令行中的 vi 模式
命令行中修改已经输入的命令比较麻烦,如果你不知道一些快捷键的话,只能使用方向键一个一个字符地移动到目标位置进行修改,对于比较复杂且过长的命令来说,效率不高. 以下信息来自 bash 的 man 页面: ...
- PHP CLI模式下的多进程应用
作者: Laruence( ) 本文地址: http://www.laruence.com/2009/06/11/930.html 转载请注明出处 PHP在很多时候不适合做常驻的SHELL进程, ...
- PHP CLI模式下的多进程应用分析
PHP在非常多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以假设用PHP做常驻SHELL, 你会常常被内存耗尽导致abort而unhappy 并且, 假设 ...
- Linux Vi进入编辑模式后使用方向键的时候,并不会使光标移动,而是在命令行中出现A、B、C、D四个字母
在linux下,初始使用Vi的时候有两个典型的问题: 1.在编辑模式下使用方向键的时候,并不会使光标移动,而是在命令行中出现A.B.C.D四个字母: 2.当编辑出现错误,想要删除时,发现Backspa ...
- Windows下的cmd命令行中设置环境编码
我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...
- php cli模式下获取参数的方法
转载声明:http://blog.csdn.net/fdipzone/article/details/51945892 php在cli模式下接收参数有两种方法 1.使用argv数组 <?php ...
- PHP CLI模式下echo换行
近日在执行导库程序的时候,需要在CLI模式下运行程序进行调试,如下图,这是什么鬼?不是我想要的结果 后经过查资料发现代码中执行的输出为 //错误方法实例 echo '其他-683\n'; //正确打开 ...
随机推荐
- selenium+chromedriver刷点击量
#coding=utf-8 import re import time import json import requests from selenium import webdriver from ...
- window alias给cmd命令起别名
场景: Linux的alias命令是个非常实用的工具,任何命令通过alias可以精简到很短,比如:alias l='ls -l' Windows也有alias类似的命令,就是:doskey,开启方法也 ...
- 使用jmeter 进行http 接口测试
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...
- Spring framewrok 源码概览
关于Spring 框架阅读记录 关于SpringMvc 框架阅读记录 1.首先看一个 spring-web 项目 项目结构 http 包 主要存储 http 相关信息 HttpRequst,HttpS ...
- java学习之路--简单基础的面试题
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...
- vue v-for的数组改变导致页面不渲染解决方法
直接在数组里,改变数组来达到重新渲染页面的目的, 需要用push等数组方法, 或者$set(),或者给数组重新赋值,来改变数组引用地址 而是直接索引= <body> <div id= ...
- c++课设
#include <stdio.h>#include <time.h>#include <math.h>#define C 60000;struct Student ...
- JACKSON详解
Jackson 框架,轻易转换JSON Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象. 前面有介绍过json-lib这个框架,在 ...
- iTextSharpH
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- python-----函数参数类型
#函数参数类型:1 位置参数 2 默认参数 3 关键字参数 4可变参数 包裹位置参数*args 包裹关键字参数 **kargs#参数位置顺序:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应 ...