2

所以,我已经尝试了一段时间,这真的行不通。我正在尝试编写一个脚本,它将许多 pdf 文件连接成一个文件,而无需在命令行界面中指定它们(它们都有相似的名称)。

#!/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

这是我的输出:

sean@taylor:~/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.

我认为脚本以某种方式认为应该在有空格的地方拆分文件,但是我尝试在空格 (\) 之前使用反斜杠并用引号 (\") 将文件名括起来,但无济于事。

有人可以帮忙吗?

4

2 回答 2

3

不要将文件名附加到字符串。改用数组:

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
于 2013-04-09T17:16:38.357 回答
-2

当您执行最终命令时

pdftk $list cat output $outputfile

$list 变量不再被引用,即实际执行的是

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

您可能需要使用不同的连接变量的方法,因为您的循环可能会不断地取消引用先前连接的值。

于 2013-04-09T17:17:29.890 回答