回车问题

回车问题

我在 bash 脚本中有这个

DAY2="20130605"<Cr>
echo  "This is yesterday date:"$DAY2"end"

为什么输出结果如下?看起来好像有一个回车符,DAY2但是它是从哪里来的呢?

ends is yesterday date:20130605

答案1

回车将光标返回到行首。您的输出字符串是:

    This is yesterday date:20130605<Cr>end

除非,当终端点击<Cr> 它将光标返回到行的开头并覆盖那里的字符

换句话说,“Thi”被“end”取代,产生:

    ends is yesterday date:20130605

要执行您似乎正在尝试执行的操作,您的脚本应该如下所示:

   variable="text"
   echo "Some sentence $variable"

哪个会输出

   Some sentence text

如果有杂散回车符,它们应该显示为^Mvi正如布鲁斯所说)

解决方案1

删除回车符或其他非打印字符的最佳方法是使用tr带有选项的命令-d,该命令删除单个字符的任何实例,其中\r是回车符的转义序列:

    tr -d '\r'

这将删除所有回车符。在脚本上运行它以删除所有回车实例,然后覆盖原始脚本文件:

    tr -d '\r' yourscript.bash > temp
    mv temp yourscript.bash

解决方案2

或者在vi打开脚本时输入:

    :%s/\r//g
    :wq

要删除文档中的回车符然后保存它。

答案2

假设<Cr>代表一个回车符,则从第一行末尾删除回车符。这里有一条可以为您完成的任务:

sed -i '1s/\r//' script.sh

要查看脚本中的回车符,请运行以下命令。

od -c script.sh | grep --color=yes '\r'

答案3

使用vivim查看有问题的 bash 脚本。您应该看到任何杂散回车符为“^M”(脱字号、em)两个字符序列。使用 hjkl 将光标移动到回车符上,点击“x”将其删除,然后点击“:wq”退出vi.

我的猜测是,当有人将文件移动到 Windows 计算机,用记事本或写字板编辑它,然后将其移回 Linux 时,文件中会出现杂散的回车符。

答案4

很难说回车符到底是如何产生的。

如果脚本是由另一个脚本或应用程序生成的,则可能是错误或故意的事故。

CR您或任何编辑该文件的人很可能无意中按下了导致插入的组合键。

例子:

  • vim : Ctrl-v Ctrl-m
  • emacs: Ctrl-q Ctrl-m
  • 还有许多其他人。

还有其他字符也可能引起麻烦,例如代码中的无换行符等。这通常会在运行脚本或编译代码时导致奇怪的错误。

我通常使用vim并经常设置(有一个组合键来切换它):

match Error /[^ -~\t]/

即:以 ASCII 和with突出显示除<space>to之外的所有内容,通常为红底白字等。~tabError

对于代码文件,我通常将其默认设置为打开。


在终端中,回车通常会导致光标移动到行首,因此任何打印都会覆盖该行上的任何现有文本,直到换行出现。

例如:

#!/bin/bash

for i in {1..100}; do
    printf "We are now at %3d%%\r" "$i"
    sleep .1
done

printf "\nAll done.\n"

\r,当使用printf结果<CR>或回车时。
\n,当使用printf结果<LF>或换行时。

相关内容