linux和widows上的shell脚本是有区别的
如果你发现两个文件的代码一样,或者语法正确,但是一运行就报解释器错误
代码看似一模一样,但实际却不一样
如果将windows编辑过的shell脚本放到Linux中运行,会产生
bash: ./iozone_Test.sh: /bin/sh^M: 解释器错误: 没有那个文件或目录
bash: ./iozone_Test.sh: /bin/sh^M: 解释器错误: 没有那个文件或目录
多了个^M代表换行符 这里有问题
//经过windows编辑后的shell脚本 换行符\r\n
$ od -tx1 -tc iozone_Test.sh
0000000 23 21 2f 62 69 6e 2f 73 68 0d 0a 63 64 20 2e 0d
# ! / b i n / s h \r \n c d . \r
0000020 0a 6d 61 6b 65 20 6c 69 6e 75 78 0d 0a 63 68 6d
\n m a k e l i n u x \r \n c h m
0000040 6f 64 20 2b 78 20 52 75 6e 5f 69 6f 7a 6f 6e 65
o d + x R u n _ i o z o n e
0000060 2e 73 68 0d 0a 4e 75 6d 3d 24 31 0d 0a 4e 75 6d
. s h \r \n N u m = $ 1 \r \n N u m
0000100 32 3d 24 32 0d 0a 69 66 20 5b 20 21 24 4e 75 6d
2 = $ 2 \r \n i f [ ! $ N u m
0000120 20 5d 0d 0a 74 68 65 6e 0d 0a 20 69 66 20 5b 20
] \r \n t h e n \r \n i f [
0000140 24 4e 75 6d 20 3e 20 30 20 5d 0d 0a 20 74 68 65
$ N u m > 0 ] \r \n t h e
0000160 6e 0d 0a 65 63 68 6f 20 22 e6 b5 8b e8 af 95 e5
n \r \n e c h o " 346 265 213 350 257 225 345
0000200 bc 80 e5 a7 8b 22 0d 0a 65 63 68 6f 20 22 69 6f
274 200 345 247 213 " \r \n e c h o " i o
//下面这个是linux下编辑的shell脚本 换行符只是\n
$ od -tx1 -tc Iozone.sh
0000000 23 21 2f 62 69 6e 2f 73 68 0a 63 64 20 2e 0a 6d
# ! / b i n / s h \n c d . \n m
0000020 61 6b 65 20 6c 69 6e 75 78 0a 63 68 6d 6f 64 20
a k e l i n u x \n c h m o d
0000040 2b 78 20 52 75 6e 5f 69 6f 7a 6f 6e 65 2e 73 68
+ x R u n _ i o z o n e . s h
0000060 0a 4e 75 6d 3d 24 31 0a 4e 75 6d 32 3d 24 32 0a
\n N u m = $ 1 \n N u m 2 = $ 2 \n
0000100 69 66 20 5b 20 21 24 4e 75 6d 20 5d 0a 74 68 65
i f [ ! $ N u m ] \n t h e
0000120 6e 0a 20 69 66 20 5b 20 24 4e 75 6d 20 3e 20 30
n \n i f [ $ N u m > 0
0000140 20 5d 0a 20 74 68 65 6e 0a 65 63 68 6f 20 22 e6
] \n t h e n \n e c h o " 346
0000160 b5 8b e8 af 95 e5 bc 80 e5 a7 8b 22 0a 65 63 68
265 213 350 257 225 345 274 200 345 247 213 " \n e c h
0000200 6f 20 22 69 6f 7a 6f 6e 65 2e 2e 2e 22 0a 53 49
o " i o z o n e . . . " \n S I
我重新再linux创建了个测试shell脚本,将代码复制上来,正常运行
解决方法
(1)dos2unix xxx xxx为文件名
(2)在VI编辑器中将^M删除:
将VI编辑器切换到命令模式下,输入 :%s/^M//g (注意^M 不是shift ^ +M 而是ctrl+v 加上ctrl+m) s///g是shell的替换命令