问题场景
- 脚本文件本应该在Linux下编辑,但是有时候会在Windows下用记事本新建超过一行的脚本文件test.sh,此时传入test.sh到Linux或者mac执行之后有时会报错;
- 在Linux或者mac下新建多行的文本文件a.txt,传入Windows下打开只有一行
原因
Windows、Linux、mac三种操作系统的换行符没有统一。
- Windows:CRLF(\r\n或0d0a)
- Linux: LF(\n或0a)
- mac: CR(\r或0d)
解决方式
针对第一种场景,Windows下的换行符比其他OS(仅区分常见Linux(Ubuntu、centos、suse、Redhat等)与mac,如果想区分更多类型的操作系统请点击这里之后改写脚本)多了一个字符,那么只要把多余的字符用空串替换掉即可,注意脚本支持多个文件但会覆盖掉原文件。
#!/bin/bash
# method one
#^M的输入方式,Ctrl+V Ctrl+M
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ]; then
sed -i 's/\r//g' $@ && echo 'successed' || echo 'failed'
elif [ $SYSTEM = "Darwin" ]; then
sed -i '' 's/^M//g' $@ && echo 'successed' || echo 'failed'
else
echo "unknown os"
fi
#!/bin/bash
# method two
#^M的输入方式,Ctrl+V Ctrl+M
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ]; then
perl -pi -e 's/\r\n|\n|\r/\n/g' $@ && echo 'successed' || echo 'failed'
elif [ $SYSTEM = "Darwin" ]; then
perl -pi -e 's/^M//g' $@ && echo 'successed' || echo 'failed'
else
echo "unknown os"
fi
针对第二种场景,其他OS(仅区分常见Linux(Ubuntu、centos、suse、Redhat等)与mac,如果想区分更多类型的操作系统请点击这里之后改写脚本)比Windows少一个字符,只要把每一行的末尾替换成相应字符即可,注意脚本支持多个文件但会覆盖掉原文件。
#!/bin/bash
# method one
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ]; then
sed -i 's/$/\r/g' $@ && echo 'successed' || echo 'failed'
elif [ $SYSTEM = "Darwin" ]; then
sed -i '' 's/$/\n/g' $@ && echo 'successed' || echo 'failed'
else
echo "unknown os"
fi
#!/bin/bash
# method two
perl -pi -e 's/\r\n|\n|\r/\r\n/g' $@ && echo 'successed' || echo 'failed'