Bash在变量中转义文件名中的空格

时间:2013-10-01 17:34:14

标签: bash escaping spaces

我对Bash很陌生,所以这可能是微不足道的,但我只是没有得到它。我正试图逃避文件名中的空格。看一看。请注意,这是一个“工作示例” - 我可以更轻松地完成使用空白页面交错文件,但我在这里是关于空间的。

#! /bin/sh

first=true
i=combined.pdf
o=combined2.pdf
for f in test/*.pdf
do
    if $first; then
        first=false
        ifile=\"$f\"
    else
        ifile=$i\ \"$f\"
    fi
    pdftk $ifile blank.pdf cat output $o
    t=$i
    i=$o
    o=$t
    break
done

假设我有一个名为my file.pdf的文件(带空格)。我希望ifile变量包含字符串combined.pdf "my file.pdf",这样pdftk就可以将它用作两个文件参数 - 第一个是combined.pdf,第二个是my file.pdf

我尝试了各种转义方法(无论是否首先转义引号本身等),但在执行pdftk时它会不断分割myfile.pdf

编辑:澄清:我正在尝试将一个变量中的多个文件名(作为多个参数)传递给pdftk命令。我希望它能识别两个文件名之间的区别,但不能在空格处撕开一个文件名。

2 个答案:

答案 0 :(得分:7)

将多个参数放入单个变量中是没有意义的。相反,将它们放入一个数组中:

args=(combined.pdf "my file.pdf");

请注意引用"my file.pdf"来保留空格。

您可以像这样使用数组:

pdftk "${args[@]}" ...

这会将两个单独的参数传递给pdftk"${args[@]}"中的引号是必需的,因为它们告诉shell将每个数组元素视为单独的"字" (即不分割数组元素,即使它们包含空格)。

作为旁注,如果您使用类似数组的bash主题,请将您的shebang更改为

#!/bin/bash

答案 1 :(得分:0)

尝试:

find test/*.pdf | xargs -I % pdftk % cat output all.pdf

正如我在其他答案的评论中所说xargs是最有效的方法。

编辑:我没有看到你需要一个空白页面,但我想你可以将上面的find传递给某个命令以将空白页面放在其间(类似于list->字符串连接)。我更喜欢这种方式,因为它更像FP。