将变量从BASH传递给PHP

时间:2016-06-08 00:39:48

标签: php bash variables

我正在使用bash脚本来激活PHP脚本,但我似乎无法将变量变为PHP ...

Bash脚本,其中$ 1 = mymusic.mp3

php /var/www/html/wave/waveform.php $1;

PHP

$mp3 = '/var/www/html/processed/' . $argv[1];
copy($mp3, "$tmpname}_0.mp3");

PHP没有收到$argv[1]变量。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您在comment中说您正在使用php5-cgi来运行该脚本。

php5-cgi是解释器的CGI version;它的目的是由Web服务器使用。

如果要在命令行上运行脚本,则必须使用解释器的CLI版本。它的名称是php(或者,可能是您系统上的php5)。

解释器handle some things differently的CLI和CGI版本。变量$argc$argv的内容是这些差异之一。

只有在On中将register_argc_argv选项设置为1(或php.ini)时,才会填充CGI版本。出于性能原因,此选项通常为{CGI Off。{/ p>

另一方面,CLI版本使用命令行中收到的参数填充$argc$argv变量,无论register_argc_argv选项的值是什么。

正如@andlrc在their answer中注意到的那样,当您在shell脚本中构造命令行时,应将$1括在双引号中,以防止shell将其拆分为单词:

php /var/www/html/wave/waveform.php "$1"

例如,如果$1的值为foo bar(两个字),则原始用法会显示为php waveform.php foo bar并显示print_r($argv)

Array
(
    [0] => waveform.php
    [1] => foo
    [2] => bar
)

另一方面,如果将$1括在引号中,命令行将变为php waveform.php "foo bar",并且shell将foo bar作为单个参数传递给PHP脚本。一个print_r($argv)输出:

Array
(
    [0] => waveform.php
    [1] => foo bar
)

作为旁注,{中缺少copy($mp3, "$tmpname}_0.mp3");。它可能应该是“copy($mp3, "${tmpname}_0.mp3");

答案 1 :(得分:2)

$argv[1]应该有效,请考虑以下示例:

% php -r 'var_dump($argv);' hello
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(5) "hello"
}

然而,您应该引用$1或者它将进行分词和全球化:

php /var/www/html/wave/waveform.php "$1"

答案 2 :(得分:-1)

我无法以任何方式工作,所以我最后安装了php5-cgi,现在就这样称呼它......

BASH

php-cgi -f /var/www/html/wave/waveform.php var=$1;

PHP

$filename = $_GET["var"];
$mp3 = '/var/www/html/processed/' . $filename;
copy($mp3, "$tmpname}_0.mp3");

第一次完美地工作。

希望它可以帮助别人,因为我浪费了几个小时试图让它以各种其他方式工作而没有成功。