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

Joo*_*ost 4 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
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试了各种方法来逃避(无论是否首先逃避引号本身等),但它仍然在分裂my和file.pdf执行pdftk时.

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

Thi*_*Not 7

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

args=(combined.pdf "my file.pdf");
Run Code Online (Sandbox Code Playgroud)

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

您可以像这样使用数组:

pdftk "${args[@]}" ...
Run Code Online (Sandbox Code Playgroud)

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

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

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 解析`find`输出的`xargs`问题与引用空格以防止shell对其进行分词是一个不同的问题. (2认同)