【问题标题】:spaces in bash scriptsbash 脚本中的空格
【发布时间】:2013-04-01 06:04:13
【问题描述】:

所以,我已经尝试了一段时间,但这真的行不通。我正在尝试编写一个脚本,它将许多 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.

我认为脚本以某种方式认为文件应该在任何有空格的地方拆分,但我已经尝试在空格 (\) 之前使用反斜杠并用引号 (\") 将文件名包围为 no有用。

有人可以帮忙吗?

【问题讨论】:

    标签: bash space pdftk


    【解决方案1】:

    当你执行你的最终命令时

    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
    

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

    【讨论】:

    • 添加 dogbane 的数组答案将使您完成剩下的工作list+=( "\"$file\"" );
    • 没有。 shell 会在 用它们的值替换变量之前解析引号,因此在变量(或数组)的值中嵌入引号根本没有任何用处。
    【解决方案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
    

    【讨论】:

    • 哇,我真的没想到会有这么快的回复......我想我真的不习惯stackoverflow! XD 非常感谢,我真的很感激!
    • 循环甚至不是必需的:list=(science.pdf science\ {1..3}.pdf)(在这种情况下;我正在利用循环采用的固定重复次数和循环体的简单结构。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多