Por que essa chamada de eco sobrescreve o texto existente?

0

Considere o seguinte arquivo CSV:

jdbc.driverClassName,oracle.jdbc.driver.OracleDriver

jdbc.username,kshitiz

Tem que ser transformado em:

-Djdbc.driverClassName=oracle.jdbc.driver.OracleDriver \

-Djdbc.username=kshitiz \

Considerando o seguinte snippet do bash: while read l; do IFS=',' read -ra arr <<< "$l" echo '-D'${arr[0]}'='${arr[1]}' \' done <properties.txt

Impressões de pegada:

\jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

\jdbc.username=kshitiz

O que está acontecendo aqui?

    
por Kshitiz Sharma 17.11.2016 / 12:22

1 resposta

2
 \jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

O que seu script realmente produziu é

  1. -Djdbc.driverClassName=oracle.jdbc.driver.OracleDriver
  2. um retorno de carro
  3.  \ (observe o espaço)
  4. uma nova linha

Por que seu roteiro imprimiu um retorno de carro? Porque o arquivo de entrada não possui novas linhas de convenção Unix, mas tem CRLFs, e o retorno de carro no final de cada linha foi considerado parte da segunda variável de matriz.

Por que os espaços em branco como um retorno de carro estão sendo anexados a uma variável por read ? Porque você mudou IFS .

Algumas palavras para o sábio:

  • Use printf , não echo - especialmente , como aqui, quando você passar echo itens que se parecem com opções de linha de comando e itens com barras invertidas.
  • Diagnostique esses tipos de problemas passando a saída por hexdump -C , cat -v ou od -t c -t x1 .
  • Se você não tiver dos2unix , será fácil fazer o equivalente a tr , sed ou perl .
por 17.11.2016 / 14:31