Bash和PHP,引用命令行参数

时间:2009-09-15 20:23:59

标签: php bash command-line shell escaping

我有一个使用Bash脚本转换pdf的PHP程序。但是,如果文件名包含空格,则不会正确传递bash脚本。

如何在bash脚本中使用空格转义文件名?你是否需要做一些特别的事情来引用“OUTFILE”变量的文件名?

Bash脚本:

#!/bin/bash

INFILE=$1
OUTFILE=${INFILE%.*}

gs \
-q \
-dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=png256 \
-r150x150 \
-sOutputFile=${OUTFILE}.png \
${INFILE}

PHP脚本:

echo "converting: ".$spool.$file . "\n";
system("/home/user/bin/pdf2png.sh " . escapeshellarg($spool . $file));

编辑:我删除了escapeshellarg()变量周围的引号。然而,这并没有解决问题。我认为这是在Bash脚本OUTFILE变量中。

4 个答案:

答案 0 :(得分:3)

在shell脚本的最后一行,在变量引用周围加上引号:

"${INFILE}"

答案 1 :(得分:2)

考虑到你的代码,我会首先尝试删除你在参数周围插入的单引号:那些不是必需的,因为你正在使用escapeshellarg

例如,temp.php文件可能包含:

$spool = "ab cd/";
$file = "gh ij";
system("sh ./test.sh " . escapeshellarg($spool . $file) . "");

test.sh

#!/bin/bash
INFILE=$1
echo $1

有了这些,输出是:

$ php temp.php
ab cd/gh ij

这看起来像你期望的那样。


如果我把单引号放回去,就像这样:

system("sh ./test.sh '" . escapeshellarg($spool . $file) . "'");

输出再次被打破:

$ php temp.php
ab

escapeshellarg正在为您提取数据(使用正确的引号和所有这些,具体取决于操作系统),您不必自己执行此操作。

答案 2 :(得分:0)

要使用空格转义文件名,只需使用。

My Tar Ball.tar

My\ Tar\ Ball.tar

因此,对于您所拥有的内容,您需要确保在调用脚本时参数包含反斜杠,或者您需要添加一些输入检查。

答案 3 :(得分:0)