有一个shell脚本可以在Windows和Linux系统中执行,但是要用到这个脚本.sh文件时,Windows下测试可以运行,复制到Linux环境就运行不了,因为多了^M字符。下面解说产生问题的具体原因及解决方法。
shell脚本的内容
#!/bin/bash -ex
set -ex
WORK_DIR=${WORKSPACE-"$(cd `dirname $0`;pwd)/.."}
PROG_NAME=$0
IMAGE_NAME=$1
IMAGE_VERSION=$2
usage() {
echo "Usage: $PROG_NAME \n
sh build_docker.sh --IMAGE_NAME XXX --IMAGE_VERSION XXX \n
--IMAGE_NAME : package or test \n
--IMAGE_VERSION : service IMAGE_VERSION. eg: 1.0.0 \n
eg: sh build_docker.sh --IMAGE_NAME test --IMAGE_VERSION 1.0.0 \n"
exit 2 # bad usage
}
if [ "$1" == "-h" ];then
usage
fi
while [[ $# -gt 0 ]]; do
key=$1
case $key in
--IMAGE_NAME)
IMAGE_NAME=$2
shift # past argument
shift # past value
;;
--IMAGE_VERSION)
IMAGE_VERSION=$2
shift # past argument
shift # past value
;;
*)
shift # past argument
shift # past value
;;
esac
done
if [ -z "$IMAGE_VERSION" ]; then
echo "ERROR: version is not defined!!!"
exit 1
fi
#cd ${WORK_DIR}/datatransfer/
mvn -DIMAGE_NAME=$IMAGE_NAME -DIMAGE_VERSION=$IMAGE_VERSION clean package docker:build -DskipTests
问题
以上脚本在Windows下面可以执行,放到Linux下面就执行不了,报错内容如下:
原因
在Linux下如上图,其意思是说因为复制粘贴,然后有一些看不见的特殊字符,你可以看到上图有很多的^M字符出现。在Linux执行cat -v可以看到有很多^M的字符,这个是Windows的换行,所以在Linux中执行脚本会失败。而在Windows中可以识别这些换行,所以在Windows中可以正常执行脚本。
解决方法
vi 文件名
命令模式下输入:
:set fileformat=unix
:w
然后重新cat -v一下看到^M都没有了,这样脚本就可以在Linux中执行起来了。
相关主题