使用多行PHP变量作为执行bash脚本的参数

时间:2019-03-18 00:58:04

标签: php bash

在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

但是,当我运行它时,没有任何输出。为什么会这样?

2 个答案:

答案 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;
}