函数在bash脚本中不工作-错误消息与'\r';
我最近安装了Debian的新版本。我创建了这个简单的脚本:函数在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
#!/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实用程序通常只希望行结束符是
,并且通常会中断或显示意外行为,并输出具有Windows样式\n
行结束符的文件,就像\r\n
在这里所做的那样bash
- 包含字符串
的错误消息表示存在此类Windows样式的行尾\r
- 将文件传递到
并检查输出行末尾的cat-v
(这是^M
字符的表示方式)是一种按需检查文件的Windows样式行结尾的方法\r
- 要将具有Windows样式行尾的文件转换为Unix样式的文件,请执行以下操作:
- 使用该实用程序,如果已经安装(通常不是),或者安装它是一个选项;如何安装它取决于您的平台;例如。:
- 在Ubuntu上:
sudo apt get install dos2unix
- 在OSX上,安装了,
brew安装dos2unix
- 在Ubuntu上:
- 或者,使用标准实用程序执行转换;有几种选择;例如。:
sed$'s/\r$/'win.txt>unix.txt
awk'sub(“\r$”,“”)+1'win.txt>unix.txt
- 上面的命令有多种变体可以就地更新文件,但它们是特定于平台的(如果有的话)
- 使用该实用程序,如果已经安装(通常不是),或者安装它是一个选项;如何安装它取决于您的平台;例如。:
- 确保用于创建用于Unix实用程序的shell脚本/文件的编辑器配置为使用Unix样式的行尾
\r\n)
,这会导致问题;使用dos2unix
或awk'sub(“\r$”,“”)+1'win.txt>Unix.txt
等工具将它们转换为Unix样式的行尾(\n
)。通常,请确保编辑器仅创建\n
-文件。代码是在哪里编写的?尝试运行cat-v test.sh
,并查找'\r'。谢谢mklement0,它解决了问题issue@mklement0请考虑写一个答案来帮助将来的来访者。我已经创建了一个包含更多背景信息的答案。一个好的答案-正确的诊断和良好的支持材料。我想知道过去有多少类似的问题被问过。我知道我以前也回答过类似的问题。谢谢,@JonathanLeffler。是的,这个问题有很多形式,我以前也回答过类似的问题。这就是为什么我一开始只发表一条评论,但由于没有人发现明显的重复,也受到安德里亚·科尔贝里尼的鼓励,我把评论变成了一个答案。