【问题标题】:PHP CLI: how to handle unnamed argumentPHP CLI:如何处理未命名的参数
【发布时间】:2014-06-25 04:54:02
【问题描述】:

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

据我了解,函数 getopt() 只允许处理“命名”参数,例如:$args = getopt("h:m:"); 将允许使用这样定义的参数运行脚本:

  ./script.php -h24 -m60;  

但是如何获取第一个(第二个、第三个...)未命名参数,例如:

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

$_SERVER['argv'] 允许获取所有参数,但根据使用的(可选)命名参数的数量,获取第一个未命名参数并不简单。

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

【问题讨论】:

  • 神奇的$argv 数组包含传递给脚本的所有参数。您可以尝试过滤掉选项,但我更倾向于不重新发明轮子并使用现成的解决方案,如symfony/console

标签: php


【解决方案1】:

我会将 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 数组函数的增强用法,或将内部循环提取到函数中。但这是一个好的开始。

【讨论】:

  • 这对我来说似乎有点过于复杂了。
  • 哦,好吧。如果您不使用--name=value 语法,我认为这是唯一的方法。
【解决方案2】:

也许您可以简单地在$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

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多