PHP CLI:如何处理未命名的参数

时间:2014-06-25 04:54:02

标签: php

在要从命令行使用的PHP脚本中:

据我所知,函数getopt()只允许处理命名的'参数,例如:$args = getopt("h:m:");将允许使用如下定义的参数运行脚本:

  ./script.php -h24 -m60;  

但是如何得到第一个(第二个,第三个......)未命名的参数,例如:

 ./script  -h24 -m60 additional_argument_1 "argument 2";

$_SERVER['argv']允许获取所有参数但是根据所使用的(可选)命名参数的数量,它不能直接获得第一个未命名的参数。

如何轻松获取additional_argument_1和可选的第二个未命名参数的值?

2 个答案:

答案 0 :(得分:0)

我会将getopt与argv结合使用。这将为您提供一个良好的开端:

<?php

print_r($argc);
print_r($argv);

$getopt = getopt("a::b::c::");

$optionals = array();

// Get all arguments delivered
foreach ($argv as $key1=>$value1) {
    // Skip the filename
    if ($key1 == 0) {
        continue;
    }

    $match = false;
    // Compare to each argument recognized by getopt
    foreach ($getopt as $key2=>$value2) {
        if ("-".$key2.$value2 === $value1 || "--".$key2.$value2 === $value1) {
            $match = true;
            break;
        }
    }
    // If it was not recognized by getopt, it is an optional. Keep it.
    if (!$match) {
        $optionals[] = $value1;
    }
}

print_r($optionals);

?>

您可以通过以下方式启动它:

php getopt.php -aarg -c optional1 optional2 optional3

它会回答:

Array
(
    [0] => optional1
    [1] => optional2
    [2] => optional3
)

此外,这里有一些非常有趣的建议: Run php script from command line with variable

但您可能想要使用多个未命名的选项重新考虑您的设计。此外,示例代码可以重构为使用回调的PHP数组函数的增强使用,或者将内部循环提取到函数中。但这是一个良好的开端。

答案 1 :(得分:0)

也许您可以简单地在$argv中查找不以破折号开头的参数:

<?php
/**
 * Get all arguments that does not start with - or --
 *
 * @return array
 */
function unnamed_arguments() {
    $args = [];
    foreach( $GLOBALS[ 'argv' ] as $arg ) {
        if( '-' !== $arg[ 0 ] ) {
            $args[] = $arg;
        }
    }
    array_shift( $args ); // discard the name of your script
    return $args;
}

var_dump( unnamed_arguments() );

注意:如果您还有其他诸如--name value之类的值,则不能使用此方法。对于带有值的参数,应改为使用语法--name=value