Como dividir a cadeia pelo fim do delimitador de linha no bash?

0

Digamos que eu tenha uma string x :

/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

Gostaria de obter o array, onde cada arquivo será listado. Meu código atual é assim:

readarray -t y <<<"$x"

Funciona muito bem, a menos que chegue ao nome do arquivo contendo espaço, como (copy) file . Readarray divide isso também e o que eu recebo em retorno é a matriz y parecida com isso:

/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file

Como evitar a divisão de nomes de arquivos?

    
por asso 24.03.2017 / 18:51

1 resposta

6

Apenas para fechar esta questão e como aconselhado em comentários a razão que sua matriz parece "dividida" é por causa da maneira que você imprimir sua matriz e não porque sua matriz é dividida por ReadArray. Quando você estiver em dúvida sobre o que realmente contém sua matriz, sugiro usar declare -p (-p para impressão) ou printf usando aspas duplas.

Na verdade, você deve sempre citar duas vezes suas variáveis, não importa se você as imprime ou apenas as usa em seus scripts.

Veja estes testes:

$ a="/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file"

$ echo "$a"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

$ echo $a
/media/root/persistence/file /media/root/persistence/anotherfile /media/root/persistence/(copy) file

$ readarray -t y <<<"$a"
$ declare -p y
declare -a y=([0]="/media/root/persistence/file" [1]="/media/root/persistence/anotherfile" [2]="/media/root/persistence/(copy) file")

$ printf '%s\n' ${y[@]}
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file

$ printf '%s\n' "${y[@]}"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file

Como mencionado por don_crissti, você tem esse comportamento porque não citou duas vezes sua variável.

Para enfatizar um pouco a importância de sempre citar suas variáveis, veja este teste adicional:

$ b=" "

$ [ $b = " " ] && echo "ok" || echo "not ok"
bash: [: =: unary operator expected
not ok

$ [ "$b" = " " ] && echo "ok" || echo "not ok"
ok
    
por 24.03.2017 / 21:38