2016-06-08 160 views
2

我使用bash脚本火PHP脚本,但我似乎无法得到所需的变量PHP ...从BASH传递一个变量到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"); 

$argv[1]变量只是不被PHP接收。有任何想法吗?

+0

你是如何运行bash脚本的?你可以共享整个bash脚本吗? – Evert

+0

没关系,我安装了php5-cgi,相应地改了它,它现在工作正常,只是无法得到它以这种方式工作 – Grant

+2

您必须在php中启用[register-argc-argv](http://php.net/manual/en/ini.core.php#ini.register-argc-argv)指令.ini'。 – baf

回答

4

您在comment说,你正在使用php5-cgi运行脚本。

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

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

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

的CGI版本填充他们只有在register_argc_argv选项在php.ini设置为On(或1)。出于性能原因,这个选项通常是CGI的Off

另一方面,无论register_argc_argv选项的值如何,CLI版本都会使用命令行中收到的参数填充$argc和变量。

由于@andlrc也their answer指出,应该用双引号括$1当你构建的shell脚本的命令行,以防止shell分裂成一句话:

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

如果,例如的$1值是foo bar(两个字),你原来的使用呈现到php waveform.php foo barprint_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");

+0

也许它不工作,因为我使用PHP而不是php5?只是为了澄清,如果它没有错误,我现在正在做的方式有什么问题吗?是否存在安全问题? – Grant

+0

是缺少的大括号只是这里的一个错字,而不是实际的脚本;) – Grant

+1

CGI和CLI版本之间存在差异。例如,'$ argc'和'$ argv'通常不由CGI设置。此外,它对脚本的运行时间施加了限制(默认值:30秒) CLI版本没有时间限制。 CGI还生成使用命令行运行脚本时不需要的HTTP标头。 CLI版本不生成头文件(既不隐式也不调用函数header())。对于所有的差异,请阅读文档:http://php.net/manual/en/features.commandline.differences.php – axiac

-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"); 

第一次工作完美。

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

+1

请注意[CGI和CLI二进制文件不等价](http://php.net/manual/en/features.commandline.differences.php)。 .. –

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"