shell脚本由window编写到linux无法运行
shell脚本除了基本语法外,还有编码格式,文本的模式类型。3方面哪个出问题都可能导致无法运行。
我这次遇到的问题就是,在window上面编写的sh脚本放到ubuntu下无法运行,最后发现原因,在window下编写的sh脚本的文本的模式类型为dos,在linux下无法运行。必须修改为unix类型。下面有修改的方法。
参考网页:
https://blog.csdn.net/mergerly/article/details/50899575
基础知识:
一、编码问题
编码常见为 gbk utf-8 big5 cp936
1、查看现在文本的编码
:set fenc
:set fileencoding
2、修改终端编码,可以设置终端或者在vim中
:set tenc=编码
:set termencoding=utf-8
3、以指定的编码显示文本,但不保存到文件中。
:set enc=编码
:set encoding=utf-8
4、转换当前文本的编码为指定的编码
:set fenc=编码
:set fileencodings=utf-8 ,然后 w (存盘)一下即可转化为 utf8 格式,
:set fileencodings=cp936 ,然后 w (存盘)一下即可转化为 ANSI 格式。
二、文本的模式类型
一般文件的类型模式为dos,unix
1、查看当前文本的模式类型
:set ff
2、设置为dos模式,即Windows下的格式
:set ff=dos
3、设置为unix模式
:set ff=unix
:%s/^M//g
三、编码转换工具
1、enconv 转换文件编码,比如要将一个GBK编码的文件转换成UTF-8编码
enconv -L zh_CN -x UTF-8 filename
2、iconv 转换,iconv的命令格式如下
iconv -f encoding -t encoding inputfile
iconv -f UTF-8 -t GBK file1 -o file
批量转换脚本
#!/bin/bash
if [ “$#” != “2” ]; then
echo “Usage: basename $0
dir filter”
exit
fi
dir=$1
filter=$2
echo $1
for file in find $dir -name "$2"
; do
echo “$file”
#iconv -f gbk -t utf8 -o $file $file
iconv -f utf8 -t gbk -c -o $file $file
done
使用方法
~/iconv_shell.sh ./ *java
3、convmv转换编码
Convmv -f 源编码 -t 新编码 [option] filename
模拟转换对比
convmv -f GBK -t UTF-8 *.mp3
真正转换命令
convmv -f GBK -t UTF-8 --notest *.mp3
4、enca自动识别转换
查看当前文件编码
enca -L zh_CN ip.txt
转换编码
enca -L 当前语言 -x 目标编码 文件名
批量转换
enca -L zh_CN -x utf-8 *