在PHP中检查命令行参数

时间:2013-04-14 11:38:26

标签: php

我想将两个不同的参数传递给我的脚本,并根据发送的参数,我需要我的脚本做一些事情。但我不知道如何定义我的条件语句。

更确切地说,我希望我的脚本在我传递“搜索”参数时进行搜索,并在我传递“show”参数时显示结果。

这是我的代码:

if ($argc > 1) {
  if ($argv[0] == 'show') {
    for ($i = 0; $i <= $argv[2]; $i++) {
      //do something
    }
  }
  elseif($argv[0] == 'search') {
    //do something
  }
} else {
  echo "no argument passed\n";
}

“IF”语句不会检查我的传递参数,无论是“搜索”还是“显示”

5 个答案:

答案 0 :(得分:2)

$argv[0]是脚本的名称,这就是您的代码不起作用的原因。

如果我有一个文件script.php:

<?php
if ($argc > 1) {
  if ($argv[1] == 'show') {
    for ($i = 0; $i <= $argv[2]; $i++) {
      print "show passed\n";
    }
  }
  elseif($argv[1] == 'search') {
    print "search passed";
  }
} else {
  echo "no argument passed\n";
}

测试给出:

$php script.php
  

没有参数传递

$php script.php search
  

搜索已通过

$php script.php show 2

show passed
show passed
show passed

答案 1 :(得分:2)

为什么不呢?

$aPassedOptions = getopt("", ['show', 'search']);
$bShow = isset($aPassedOptions['show']);
$bSearch = isset($aPassedOptions['search']);
var_dump($aPassedOptions, $bShow, $bSearch);


script.php --show
script.php --search
script.php --show --search

更多@ http://www.php.net/getopt(例如,需要参数等)

答案 2 :(得分:1)

我会使用switch/case代替您的条件($argc),因为您需要操作名称和参数,而$argv[0]是脚本名称,因此您的commandargv[1]及其参数argv[2]及以上。我还会从argc/argv全球

获得$_SERVER
if ($_SERVER['argc'] >= 3) {
  switch( $_SERVER['argv'][1] ) {
     case 'show':
        ...
        break;

     case 'search':
        ...
        break;
   }
} else {
   // no args case
}

答案 3 :(得分:1)

尝试使用$argv[1]

http://php.net/manual/en/reserved.variables.argv.php

$argv[0]包含名为

的脚本名称

答案 4 :(得分:0)

使用$ argv [1]。

在UNIX模型中(如... C),传统的ARGV数组从调用的第一个二进制文件开始,然后传递参数。在PHP的情况下,如果你通过PHP(“php script.php”)调用你的脚本而不是哈希打击它(“./script.php”),php会自动从$ argv [0]中删除它。

所以在你的情况下:

$ cat argv.php
#!/usr/bin/php
<?php
    print_r($argv);
?>
$ php argv.php search
Array
(
    [0] => argv.php
    [1] => search
)
$ ./argv.php search
Array
(
    [0] => ./argv.php
    [1] => search
)
$