我有一个使用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变量中。
答案 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)