2013-04-09 88 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