Como atribuir nomes de arquivos com espaço a outra variável sem perder o separador [duplicado]

2

Eu tenho um script bash como:

files="${@:2}"
for f in $files; do
  echo $f
done

que leva a expansão do shell do segundo argumento para o último e imprime. No entanto, não funciona com arquivos com espaços. Imprime arquivos:

test image.jpg

como

test
image.jpg

Se eu usar:

for f in "${@:2}"; do
  echo $f
done

sem atribuí-lo a $ files, funciona bem.

Eu também tentei usar o primeiro caso com aspas "$files" e não funciona. Imprime todos os arquivos em uma linha. Como posso atribuir os nomes dos arquivos a outra variável, enquanto ainda faz com que funcione ao usar expansão como em loop?

    
por texasbruce 11.10.2015 / 21:16

1 resposta

2

Para que isso funcione, você precisa de files para ser uma matriz, não uma variável. Experimente:

files=("${@:2}")
for f in "${files[@]}"; do
  echo "$f"
done

Exemplo:

$ bash script.sh first "test image.jpg" "another test.txt"
test image.jpg
another test.txt

Discussão

Do código original, considere esta afirmação:

files="${@:2}"

Isso atribui todos os argumentos após o primeiro a files como uma única cadeia indiferenciada. Podemos ver isso com este script:

$ cat test.sh
files="${@:2}"
declare -p files
$ bash test.sh first "test image.jpg" "another test.txt"
declare -- files="test image.jpg another test.txt"

Como você pode ver, toda a distinção entre o segundo e terceiro argumentos foi perdida.

    
por 11.10.2015 / 21:20