2013-12-17 23 views
4

我試圖運行從終端下面的PHP:的zsh:數學不好表達:操作數預計將在`「HTTP_HOST ...」

php -r "error_reporting(E_NONE); $_SERVER['HTTP_HOST'] = 'localhost'; 
require('./config/site.php'); 
echo json_encode(array('HOST' => DB_SERVER, 'USER' => DB_USERNAME, 'PASS' => DB_PASSWORD, 'NAME' => DB_DATABASE));" 

而且我發現了以下錯誤:

zsh: bad math expression: operand expected at `'HTTP_HOST...'

逃離=沒有任何作用,逃避[給出了一個PHP解析錯誤:

PHP Parse error: syntax error, unexpected '[', expecting identifier (T_STRING) in Command line code on line 1

我在這裏做錯了什麼?我如何從終端運行上面的代碼?

回答

4

由於您在雙引號內運行PHP代碼,因此PHP解釋器嘗試用$ _SERVER ['HTTP_HOST']的值替換$ _SERVER ['HTTP_HOST'],以使其正常工作,您需要越獄$

php -r "error_reporting(E_NONE); \$_SERVER['HTTP_HOST'] = 'localhost'; 
require('./config/site.php'); 
echo json_encode(array('HOST' => DB_SERVER, 'USER' => DB_USERNAME, 'PASS' => DB_PASSWORD, 'NAME' => DB_DATABASE));" 

我在我的一個盒子上做了一個測試來驗證。

沒有逃脫

[[email protected] ~]# php -r "var_dump($_SERVER['HTTP_HOST']);" 
array(1) { 
    [0] => 
    string(9) "HTTP_HOST" 
} 

隨着逃逸

[[email protected] ~]# php -r "var_dump(\$_SERVER['HTTP_HOST']);" 
NULL 

,另一個很好的措施

[[email protected] ~]# php -r "error_reporting(E_NONE); \$_SERVER['HTTP_HOST'] = 'localhost'; 
var_dump(\$_SERVER['HTTP_HOST']);" 
string(9) "localhost" 
+0

這不是試圖取代變量PHP解釋器,它的外殼( zsh中)。在調用PHP二進制文件之前,擴展shell變量。 –

+0

從上例可以看出它是PHP。 shell不會像這樣替換字符串中的變量。 – ollieread

+0

我不知道你爲什麼認爲shell「不會替換字符串中的變量」。 SUS/POSIX清楚地定義了雙引號塊要在啓用變量擴展的情況下進行解釋。根據shell(原始問題聲明它是zsh),'printf'<%s> \ n'「$ _SERVER ['HTTP_HOST']」將會產生一個數學錯誤(zsh),或者$ _SERVER會被擴展爲什麼都沒有(bash,POSIX等)。 PHP發生錯誤是因爲數據已經擴展爲零長度字符串,並且PHP在調用時接收到格式錯誤的語法。 –