函数在bash脚本中不工作-错误消息与'\r';

函数在bash脚本中不工作-错误消息与'\r';,bash,function,line-endings,Bash,Function,Line Endings,我最近安装了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 toke

我最近安装了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样式的文件,请执行以下操作:
    • 使用该实用程序,如果已经安装(通常不是),或者安装它是一个选项;如何安装它取决于您的平台;例如。:
      • 在Ubuntu上:
        sudo apt get install dos2unix
      • 在OSX上,安装了,
        brew安装dos2unix
    • 或者,使用标准实用程序执行转换;有几种选择;例如。:
      • sed$'s/\r$/'win.txt>unix.txt
      • awk'sub(“\r$”,“”)+1'win.txt>unix.txt
      • 上面的命令有多种变体可以就地更新文件,但它们是特定于平台的(如果有的话)
  • 确保用于创建用于Unix实用程序的shell脚本/文件的编辑器配置为使用Unix样式的行尾

脚本中似乎有Windows样式的行尾(
\r\n)
,这会导致问题;使用
dos2unix
awk'sub(“\r$”,“”)+1'win.txt>Unix.txt
等工具将它们转换为Unix样式的行尾(
\n
)。通常,请确保编辑器仅创建
\n
-文件。代码是在哪里编写的?尝试运行
cat-v test.sh
,并查找'\r'。谢谢mklement0,它解决了问题issue@mklement0请考虑写一个答案来帮助将来的来访者。我已经创建了一个包含更多背景信息的答案。一个好的答案-正确的诊断和良好的支持材料。我想知道过去有多少类似的问题被问过。我知道我以前也回答过类似的问题。谢谢,@JonathanLeffler。是的,这个问题有很多形式,我以前也回答过类似的问题。这就是为什么我一开始只发表一条评论,但由于没有人发现明显的重复,也受到安德里亚·科尔贝里尼的鼓励,我把评论变成了一个答案。