bash 脚本中的转义空格不起作用

bash 脚本中的转义空格不起作用

我尝试过的没有任何效果。查看下面脚本中的 grep to array 行。逃避似乎并没有什么卵用。但如果我制作一个静态分配的数组就可以了。

例如:

files=(somefile.txt
some\ other\ file.pdf
"yet another file.txt")

这不起作用:

#!/bin/bash
find . -name "$1" |
(
        cat - > /tmp/names
        file -N --mime-type --files-from /tmp/names
) |
(
        cat - > /tmp/mimes
#       files=("$(grep -o '^[^:]*' /tmp/mimes)") #one element array
#       files=($(grep -o '^[^:]*' /tmp/mimes)) #files with spaces end up split in to several elements
#       files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\\ /g')) #same but with \ terminated strings
        files=($(grep -o '^[^:]*' /tmp/mimes | cat <(echo '"') - <(echo '"')))
        mimes=($(grep -o '[^:]*$' /tmp/mimes))

        total=${#files[*]}
        for (( i=0; i<=$(( $total -1 )); i++ ))
                do
                echo Mime: "${mimes[$i]}" File: "${files[$i]}"
        done
        printf "$i\n"
)

编辑:澄清

文件 /tmp/mimes 包含:

./New Text.txt: text/plain

如果我 grep 它来获取“:”之前的所有内容

grep -o '^[^:]*' /tmp/mimes

它输出:./New Text.txt

我想将这个输出放入一个数组中,但它有一个空格,所以我使用 sed 转义该空格。

files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\\ /g'))

这是行不通的。我最终得到 files[0] = "./New\" 和 files[1] = "Text.txt"

我的问题是为什么逃离空间不起作用?

如果我做:

files=(./New\ Text.txt)

它确实有效,但是 files[0] = "./New Text.txt" 为什么当您手动执行转义时可以工作,但当它是 grep 和 sed 的输出时却不起作用。创建数组的行为似乎不一致。

答案1

如果您想用换行符分隔文件名,请将 IFS 设置为$'\n'并关闭通配:

set -f
IFS=$'\n' files=($(grep -o '^[^:]*' /tmp/mimes))
set +f

请注意,如果您的文件名包含换行符(除了冒号之外,由于使用 grep 提取名称的方式而导致冒号损坏),它会中断。

相关内容