Pourquoi mon commande echo écrit deux mots sur l'autre?

voix
0

J'ai un script bash qui prend deux mots et (devrait) les concaténer.

#!/bin/bash

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

echo ADJ $adj
echo NOU $noun

echo $adj $noun

Les variables sont correctement définies, mais pour une raison quelconque, l'écho finale ne fonctionne pas correctement. Par exemple:

ADJ humbler
NOU lyric
 lyricr

Ou:

ADJ bipinnate
NOU lipases
 lipasese

Ce qui se passe ici est que la sortie finale est la dernière lettre de l'adjectif à la fin du nom. Pourquoi est-ce, et comment puis-je arrêter?

Il y a un Asciinema de ce phénomène ici: https://asciinema.org/a/199297

Créé 02/09/2018 à 05:40
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Vos fichiers d'entrée ont très probablement CRLF ( \r\nfin de ligne). Le \r(retour chariot) provoquera la sortie pour revenir en arrière à la première colonne de la ligne courante, comme concaténation se débarrasse de \net non la \r.

C'est le format utilisé par Windows / DOS.

Vous pouvez convertir les fichiers, ou vous pouvez dépouiller à l' aide tr, par exemple:

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

Vous pouvez également exécuter ce à travers les fichiers plutôt que, par exemple:

tr -d '\r' < adjectives.txt > adjectives-reformatted.txt
Créé 02/09/2018 à 05:50
source utilisateur

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