首页 > 解决方案 > 为什么我的 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

标签: bashcarriage-return

解决方案


您的输入文件很可能有 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

推荐阅读