2009-09-15 112 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