2009-09-15 74 views
2

我有一个使用Bash脚本来转换PDF的PHP程序。但是,如果文件名包含空格,则不会正确地通过bash脚本。Bash和PHP,引用命令行参数

如何用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变量中。

回答

3

在你的shell脚本的最后一行,把引号将变量引用:

"${INFILE}" 
+0

这个工作!我在bash脚本的最后两行添加了变量的引号。 ... -sOutputFile =“$ {OUTFILE} .png”\ “$ {INFILE}” – jjclarkson 2009-09-15 20:58:32

0

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

My Tar Ball.tar 

My\ Tar\ Ball.tar 

所以对你有什么,你要么需要确保你的参数包含在脚本被称为回斜线,否则你将需要添加一些输入检查。

1

考虑到你的代码,我会尝试,首先,删除你插入角落找寻参数单引号:那些不应该是必要的,因为你正在使用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是逃避数据您(用正确的引号和所有这些,取决于操作系统),你不必自己做。

+0

我删除周围的escapeshellarg我额外的报价。然而,bash脚本给我一个未定义的文件名。 – jjclarkson 2009-09-15 20:50:38

+0

哦;在这种情况下,shell脚本中可能存在一个问题:-(首先,如果在最后一行尝试将双引号arround $ {INFILE}放在最后一行,会怎么样呢?也许你必须做同样的事情$ {OUTFILE} .png,btw ;;如果它仍然不起作用,如果从shell脚本中对两个变量执行“回声”,你会得到什么?是你期望的吗? – 2009-09-15 20:53:48