在PHP中,我有一个返回多行文本的变量,类似于下面显示的内容。
*
*clefF4
*k[f#c#g#d#a#]
*d:
*M6/4
然后我想在PHP中将此变量用作执行bash脚本的参数。
我的PHP代码如下($filechosen
是上面的文本字符串):
$output = shell_exec("/path/to/bash/script.sh $filechosen");
echo "<pre>$output</pre>";
下面是使用变量'$filechosen
'作为参数的极其简单的bash脚本:
#!/bin/bash
returnExpression=$(echo "$1" | grep 'k\[')
echo $returnExpression
但是,当我运行它时,没有任何输出。为什么会这样?
答案 0 :(得分:1)
您应该始终转义要替换为命令行的变量,PHP提供了功能escapeshellarg()
来实现。
$output = shell_exec("/path/to/bash/script.sh " . escapeshellarg($filechosen));
或
$escaped = escapeshellarg($filechosen);
$output = shell_exec("/path/to/bash/script.sh $escaped");
答案 1 :(得分:0)
在GNU / Linux中,命令的常见方式是处理流。 grep
也这样做。只要有可能,就不要破坏这种模式。在您的特定示例中,将其包装到位置参数中没有任何意义。
您可以使用popen
将流写入已执行的命令:
<pre>
<?php
$filechosen = <<<_EOS_
*
*clefF4
*k[f#c#g#d#a#]
*d:
*M6/4
_EOS_;
if($handle = popen("grep 'k\\['", "w"))
{
fwrite($handle, $filechosen);
pclose($handle);
}
?>
<pre>
如果要将输出流读入变量中,请改用proc_open
函数。
if($handle = proc_open("grep 'k\\['", [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $streams))
{
[$stdin, $stdout, $stderr] = $streams;
fwrite($stdin, $filechosen);
fclose($stdin);
$output = stream_get_contents($stdout);
fclose($stdout);
$error = stream_get_contents($stderr);
fclose($stderr);
proc_close($handle);
echo $output;
}