文件格式引起的脚本执行错误

2023-02-16 00:00:00 脚本 字符 两个 换行符 编写

问题

当我们使用 Windows 桌面下的编辑器编写一个 Shell 文件时,很容易将文件使用的换行符保存为 dos 格式。如果将文件上传到 Linux 服务器执行时,可能会遇到下面的错误。这是因为

# 显示一个简单的shell文件
$ cat dosnewline.sh                                   
#!/bin/sh

echo "This is a file with dos newline"


# 该文件使用了 dos 格式的换行符
$ od -bc dosnewline.sh
0000000   043 041 057 142 151 156 057 163 150 015 012 015 012 145 143 150
           #   !   /   b   i   n   /   s   h  \r  \n  \r  \n   e   c   h
0000020   157 040 042 124 150 151 163 040 151 163 040 141 040 146 151 154
           o       "   T   h   i   s       i   s       a       f   i   l
0000040   145 040 167 151 164 150 040 144 157 163 040 156 145 167 154 151
           e       w   i   t   h       d   o   s       n   e   w   l   i
0000060   156 145 042 015 012 015 012 015 012                            
           n   e   "  \r  \n  \r  \n  \r  \n                            
0000071
# 使用 sh 执行的时候就会有一个报错
$ h dosnewline.sh    
: command not found 2: 
This is a file with dos newline
: command not found 4: 
: command not found 5: 
# 获取脚本的返回码也不是0,在一些自动化调用的场景中就会认为脚本执行失败,从而引发后续的问题
$ echo $?             
127
# 退出码 127 的意思是 command not foud,对应具体的 dos 换行符所在的行

换行符

我们通常所说的换行符在 ASCII 码表中对应下面两个字符。

十进制十六进制字符编程时
10ALF(Line feed,New Line)\n
13DCR(Carriage return)\r

相关文章