Por que o meu comando echo escrever duas palavras sobre os outros?

votos
0

Eu tenho um script que pega duas palavras e (deve) concatenar-los.

#!/bin/bash

adj=$(shuf -n1 adjectives.txt)
noun=$(shuf -n1 nouns.txt)

echo ADJ $adj
echo NOU $noun

echo $adj $noun

As variáveis ​​estão sendo definidas corretamente, mas por algum motivo, o eco final não funciona direito. Por exemplo:

ADJ humbler
NOU lyric
 lyricr

Ou:

ADJ bipinnate
NOU lipases
 lipasese

O que está acontecendo aqui é que o resultado final é a última carta do adjetivo no final do substantivo. Por que é isso, e como eu posso parar com isso?

Há uma Asciinema deste fenômeno aqui: https://asciinema.org/a/199297

Publicado 02/09/2018 em 05:40
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Seus arquivos de entrada mais provável ter CRLF ( \r\nterminações) de linha. O \r(retorno de carro) fará com que a saída para saltar de volta para a primeira coluna da linha atual, como seu concatenação se livrar da \ne não a \r.

Esse é o formato usado pelo Windows / DOS.

Você pode converter os arquivos, ou você pode tira-lo usando tr, por exemplo:

adj="$(shuf -n1 adjectives.txt | tr -d '\r')"
noun="$(shuf -n1 nouns.txt | tr -d '\r')"

Você também pode executar esta através dos arquivos em vez disso, por exemplo:

tr -d '\r' < adjectives.txt > adjectives-reformatted.txt
Respondeu 02/09/2018 em 05:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more