Nada que eu tentei funciona.
Olhe para o grep para as linhas do array no script abaixo. Escapar parece não fazer nada. Mas se eu fizer um array estaticamente atribuído, tudo bem.
Como:
files=(somefile.txt
some\ other\ file.pdf
"yet another file.txt")
Isso não funciona:
#!/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"
)
Editar: esclarecimento
arquivo / tmp / mimes contém:
./New Text.txt: text/plain
Se eu o grep para obter tudo antes do ":"
grep -o '^[^:]*' /tmp/mimes
gera: ./New Text.txt
Eu quero colocar essa saída em uma matriz, mas ela tem um espaço, então eu escapei do espaço usando sed.
files=($(grep -o '^[^:]*' /tmp/mimes | sed 's/ /\ /g'))
Isso não funciona. Acabo com arquivos [0]="./New \" e arquivos [1]="Text.txt"
Minha pergunta é por que não está escapando do trabalho espacial?
Se eu fizer:
files=(./New\ Text.txt)
Ele funciona no entanto arquivos [0]="./New Text.txt" Por que o escape quando você faz isso manualmente funciona, mas quando é a saída do grep e sed não funciona. Parece que o comportamento de criar uma matriz é inconsistente.