我在 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
如果有杂散回车符,它们应该显示为^M
(vi
正如布鲁斯所说)
解决方案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
使用vi
或vim
查看有问题的 bash 脚本。您应该看到任何杂散回车符为“^M”(脱字号、em)两个字符序列。使用 hjkl 将光标移动到回车符上,点击“x”将其删除,然后点击“:wq”退出vi
.
我的猜测是,当有人将文件移动到 Windows 计算机,用记事本或写字板编辑它,然后将其移回 Linux 时,文件中会出现杂散的回车符。
答案4
很难说回车符到底是如何产生的。
如果脚本是由另一个脚本或应用程序生成的,则可能是错误或故意的事故。
CR
您或任何编辑该文件的人很可能无意中按下了导致插入的组合键。
例子:
vim :
Ctrl-v Ctrl-memacs:
Ctrl-q Ctrl-m- 还有许多其他人。
还有其他字符也可能引起麻烦,例如代码中的无换行符等。这通常会在运行脚本或编译代码时导致奇怪的错误。
我通常使用vim
并经常设置(有一个组合键来切换它):
match Error /[^ -~\t]/
即:以 ASCII 和with突出显示除<space>
to之外的所有内容,通常为红底白字等。~
tab
Error
对于代码文件,我通常将其默认设置为打开。
在终端中,回车通常会导致光标移动到行首,因此任何打印都会覆盖该行上的任何现有文本,直到换行出现。
例如:
#!/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>
或换行时。