【问题标题】:Bash escaping spaces in filename, in variablebash 在文件名中转义空格,在变量中
【发布时间】:2013-10-07 23:34:53
【问题描述】:

我对 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 命令。我希望它能够识别两个文件名之间的区别,但不要在空格处将一个文件名分开。

【问题讨论】:

  • 不是烦人,而是两秒钟的谷歌搜索,我发现了这个:lornajane.net/posts/2011/combining-pdf-files-with-pdftk
  • 不过,这是我的问题的“最小工作示例”。在附加文件之前,我正在做一些其他的事情。
  • 啊,因为您需要在每页之间留一个空白页。我没看到。
  • 你为什么变得这么复杂?使用 2 个变量:pdftk "$i" "$f" ...
  • @AdamGent - 感谢 lornajane.net/posts/2011/combining-pdf-files-with-pdftk 的指针 - 我通过 xargs 的 -J 选项学到了一些新东西

标签: bash escaping spaces


【解决方案1】:

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

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

注意"my file.pdf" 被引用以保留空格。

你可以像这样使用数组:

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

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

附带说明,如果您使用 bashisms 之类的数组,请将您的 shebang 更改为

#!/bin/bash

【讨论】:

  • 我很确定如果文件中有空格,它将无法正常工作。我记得曾经在做类似的事情时遇到过问题。
  • 这是我应该从一开始就开始做的事情。尝试为此使用字符串是无稽之谈。谢谢!
  • @AdamGent 来自bash 联机帮助页关于数组的部分:If the word is double-quoted,...${name[@]} expands each element of name to a separate word. 换句话说,数组元素在空格上分割。
  • @ThisSuitIsBlackNot 我不记得确切的问题,但我认为这是文件名中换行符的问题。我不得不使用空分隔符 ala find/xargs 组合。
  • xargs 解析来自find 的输出的问题与引用空格以防止shell 对其执行分词是不同的问题。
【解决方案2】:

试试:

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

正如我在我的 cmets 关于其他答案中所说,xargs 是最有效的方法。

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

【讨论】:

  • 你没有逃避空间。这应该是find test/*.pdf -print0 | xargs -0 -J % pdftk % cat output all.pdf
猜你喜欢
  • 2012-08-08
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
相关资源
最近更新 更多