我尝试过的没有任何效果。查看下面脚本中的 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 提取名称的方式而导致冒号损坏),它会中断。