我正在使用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]
变量。有什么想法吗?
答案 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");
第一次完美地工作。
希望它可以帮助别人,因为我浪费了几个小时试图让它以各种其他方式工作而没有成功。