2016-11-07 85 views
0

我想从php中检索一些输出,使用bash。到目前为止,我有这个:BASH从PHP获取结果

CODE="<?php chdir('$WWW');" # $WWW should be interpolated 

CODE+=$(cat <<'PHP' # no interpolation for the rest of the code 
    require_once('./settings.php'); 

    $db = $databases['default']['default']; 

    $out = [ 
     'user=' . $db['username'] 
     //more here 
    ]; 

    echo implode("\n", $out) 
PHP) 

echo $CODE  

#RESULT=$($CODE | php) 

#. $RESULT 

总而言之,我有麻烦的字符串插值。现在我得到:

line 10: <?php: command not found 

那么我该如何正确地逃避字符串,使整个PHP代码?

所有的一切,PHP应该产生输出这样的:

key=value 
key2=value2 

可以在未来

由于是“源”,由庆典!

回答

2

使用Here String

php <<< "$CODE" 

使用管

echo "$CODE" | php 

如果你想存储输出到一个变量,使用command substitution

result=$(php <<< "$CODE") 
result=$(echo "$CODE" | php) 
+0

这是更完整的答案,所以我会选择那个! – philipp

2

这是错误的:RESULT=$($CODE | php) - shell变量不能像那样传递,它尝试运行$CODE作为命令。

相反,你可以做RESULT=$(echo "$CODE" | php)RESULT=$(php <<<"$CODE")

0

我认为你必须在这里2个错误:在这里,DOC块

  1. 错误。 PHP周围不需要'
  2. 您需要在您的PHP代码中转义$,否则它将被bash扩展。

尝试:

#!/bin/bash 

CODE="<?php chdir('$WWW');" # $WWW should be interpolated 

CODE+=$(cat << PHP # no interpolation for the rest of the code 
    //require_once('./settings.php'); 

    \$db = "foo"; 

    \$out = [ 
     'user=' . \$db 
     //more here 
    ]; 

    echo implode("\n", \$out) 
PHP 
) 

echo $CODE 

这将打印出:

<?php chdir("/tmp"); //require_once('./settings.php'); $db = "foo"; $out = [ 'user=' . $db //more here ]; echo implode("\n", $out); 

可以在PHP中进行评估。

+1

在Heredoc语句中围绕PHP使用'''是一件好事。这意味着内容不会受到特殊字符的扩展 - 因此在$'之前不需要添加反斜杠。 –

+1

感谢您的信息。我没有意识到这一点。永远不要停止学习。 – cb0