bash - 为什么我的 echo 命令会在彼此上写两个单词?
问题描述
我有一个 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
这里发生的是最终输出是形容词在名词末尾的最后一个字母。为什么会这样,我该如何阻止它?
这里有这种现象的 Asciinema:https ://asciinema.org/a/199297
解决方案
您的输入文件很可能有 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