函数在 bash 脚本中不起作用 - 与“\r”相关的错误消息

Function not working in a bash script - error messages relate to '\r'

我最近安装了新版本的 Debian。我创建了这个简单的脚本:

#!/bin/bash

print_something () {
  echo Hello I am a function
}

print_something
print_something

然而,这在我发出 bash test.sh:

时显示此错误
test.sh: line 3: $'\r': command not found
test.sh: line 4: syntax error near unexpected token `$'{\r''
'est.sh: line 4: `print_something () {

我做错了什么? 非常感谢!

我通过安装 dos2unix 然后转换文件解决了这个问题。 非常感谢 mklement0 指出了这一点。

正在诊断:

  • Unix 实用程序通常期望行尾只有 \n,并且通常会中断或显示意外行为并输出具有 Windows 样式 \r\n 行尾的文件 - 如bash 在这里做。
  • 包含 字符串 \r 的错误消息表明存在此类 Windows 样式的行结尾。
  • 将文件传递给 cat -v 并在输出行末尾检查 ^M 的输出(这是 \r 个字符的表示方式)是一种检查根据需要为 Windows 样式的行结尾创建文件。

修复:

  • 将具有 Windows 风格的行尾的文件转换为 Unix 风格的行尾:
    • 使用 dos2unix 实用程序,如果已经安装(通常是 而不是 ),或者安装它是一个选项;如何安装取决于您的平台;例如。:
      • 在 Ubuntu 上:sudo apt-get install dos2unix
      • 在 OSX 上,安装了 Homebrewbrew install dos2unix
    • 或者,使用标准实用程序来执行转换;有几种选择;例如。:
      • sed $'s/\r$//' win.txt > unix.txt
      • awk 'sub("\r$", "")+1' win.txt > unix.txt
      • 上述命令的变体就地更新文件,但它们平台特定,如果可用的话全部.
  • 确保您用来创建 shell 用于 Unix 实用程序的脚本/文件的编辑器配置为使用 Unix 样式的行结尾。