2013-04-09 87 views
1

所以,我一直在嘗試一段時間,這真的不起作用。我試圖編寫一個腳本,將許多pdf文件連接成一個,而不需要在命令行界面指定它們(它們都具有相似的名稱)。bash腳本中的空格

#!/bin/bash 

i=1 
list="science.pdf" 
outputfile="file.pdf" 

while [ $i -le 3 ]; do 
    file="science (${i}).pdf" 
    list="$list $file" 
    let i=i+1 
done 

pdftk $list cat output $outputfile 

這是我的輸出:

[email protected]:~/Downloads/understanding/s0$ ./unite.sh 
Error: Failed to open PDF file: 
    science 
Error: Failed to open PDF file: 
    (1).pdf 
Error: Failed to open PDF file: 
    science 
Error: Failed to open PDF file: 
    (2).pdf 
Error: Failed to open PDF file: 
    science 
Error: Failed to open PDF file: 
    (3).pdf 
Errors encountered. No output created. 
Done. Input errors, so no output created. 

我的身影,不知何故腳本認爲,文件應該被分拆的地方therre是一個空間,但我的空間之前都試過反斜槓(\),並用引號(\「)無濟於事包圍文件名

誰能幫助請

回答

2

不要將文件名添加到字符串使用數組來代替:?

i=1 
list=("science.pdf") 
outputfile="file.pdf" 

while [ $i -le 3 ]; do 
    file="science (${i}).pdf" 
    list+=("$file") 
    let i=i+1 
done 

pdftk "${list[@]}" cat output $outputfile 

您還可以進一步通過簡化您的腳本一個for循環,如下圖所示:

list=("science.pdf") 
for ((i=1; i<=3; i++)); do 
    file="science (${i}).pdf" 
    list+=("$file") 
done 
pdftk "${list[@]}" cat output $outputfile 
+0

哇,我真的不期待這樣一個快速的答覆...猜我真的不習慣stackoverflow! XD 非常感謝,我非常感謝! – 2013-04-09 17:21:45

+0

循環甚至不是必需的:'list =(science.pdf science \ {1..3} .pdf)'(在這種情況下,我利用了循環所採用的固定重複次數和簡單的循環體結構。) – chepner 2013-04-10 12:04:18

-2

當你執行你的最後一個命令

pdftk $list cat output $outputfile 

的$列表變量沒有更長的報價,即實際執行的是

pdftk science.pdf science (1).pdf ... science (3).pdf cat output file.pdf 

您需要超級引用您的$ list變量。嘗試:

while [ $i -le 3 ]; do 
    file="science (${i}).pdf" 
    list="$list \"$file\"" 
    let i=i+1 
done 

您可能需要使用串聯變量作爲你的循環可能會繼續解除引用先前級聯值的不同方法。

+0

添加dogbane的數組答案會爲您帶來其他方面的效果'list + =(「\」$ file \「」); ' – 2013-04-09 17:22:39

+1

不可以。否則,shell會在用它們的值替換變量之前解析引號*,因此,將引號嵌入變量(或數組)的值根本無用。 – 2013-04-09 22:32:02