为什么我的echo命令互相写两个字?

时间:2018-09-02 05:40:25

标签: bash carriage-return

我有一个bash脚本,可以选择两个单词并将它们连接起来。

#!/bin/bash

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

echo ADJ $adj
echo NOU $noun

echo "$adj $noun"

已正确设置变量,但由于某些原因,最终回显无法正常工作。例如:

ADJ humbler
NOU lyric
 lyricr

或者:

ADJ bipinnate
NOU lipases
 lipasese

这里发生的是最终输出是形容词在名词末尾的最后一个字母。为什么会这样,我该如何阻止呢?

在这里有这种现象的相关性:https://asciinema.org/a/199297

1 个答案:

答案 0 :(得分:1)

您的输入文件很可能具有CRLF(\r\n)行尾。 \r(回车)将导致输出跳回到当前行的第一列,因为您的串联摆脱了\n而不是\r

这是Windows / DOS使用的格式。

您可以转换文件,也可以使用tr将其删除,例如:

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

您也可以跨文件运行此代码,例如:

tr -d '\r' < adjectives.txt > adjectives-reformatted.txt