2

だから、私はしばらく試してきましたが、これは本当にうまくいきません。コマンドラインインターフェイスでそれらを指定するという退屈な手間をかけずに、多くのpdfファイルを1つに連結するスクリプトを作成しようとしています(それらはすべて似たような名前を持っています)。

#!/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 に答える