2016-06-08 125 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"