有一个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中执行起来了。
相关主题 |