关于linux执行粘贴/上传自在windows编辑过的shell脚本的问题

关于linux执行粘贴/上传自在windows编辑过的shell脚本的问题


如果在windows编辑过shell脚本,再上传或粘贴回linux环境去执行脚本,会因为系统间格式 空格格式的问题,导致你的脚本被linux认为不符合shell的语法,其实就是字符错了,在windows的空格,到了linux就不是空格了。如果执行了这种 混入了错误空格的sh脚本,报错可能有以下错误 ,其中的 : : 就是这个意思。

./a.sh: line 31:  : command not found
./a.sh: line 38:  : command not found
./a.sh: line 42:  : command not found
./a.sh: line 42:  : command not found
./a.sh: line 59: syntax error near unexpected token `then'
./a.sh: line 59: `  if [ -z "${PID}" ]; then'

查看方法:用notepad打开sh脚本, 视图->显示符号->显示所有字符 如果看到脚本的linux格式空格,也就是一个 红色的小红点,之前有空格,不是致密的,那么就是这个问题了。如图

在这里插入图片描述
可以直接用notepad全局替换掉这种空格为那种小红点,替换为的内容不要自己手动打空格,复制那个小红点粘贴过去。

将脚本上传到linux后,如果还是执行报错如

-bash: ./startup.sh: /bin/bash^M: bad interpreter: No such file or directory

请vim xx.sh ,键入

:set ff?

查看文档的格式是否为unix,如果是dos,请重新编辑脚本,键入

:set ff=unix
:wq

保存退出后,再次尝试。

最后建议进行各种诸如建表语句、脚本等,在文档里不要复制粘贴,最好是插入文件,把文件放进文档里,就不会有这么多问题。
最后附上感觉很不错的启停脚本,这俩脚本可以配合使用,可以单独使用starter.sh,使用前请仔细看一下再使用,以免引起预期外的错误。(如果在jenkins使用,网上的人都说在启动jar包的命令的上边一行要加上BUILD_ID=dontKillMe,以免jenkins退出时杀掉所有衍生进程)

starter.sh

#!/bin/bash
#本脚本基本无需改动,注意要点均已用中文说明
# 1. 请将本脚本放到Linux系统的path路径下,最好是/bin目录下
# 2. 请给本脚本设备可执行权限
# 3. 启动示例         sh starter.sh xxx.jar start
# 4. 重启示例         sh starter.sh xxx.jar restart
# 5. 停止示例         sh starter.sh xxx.jar stop
# 6. 查看状态示例     sh starter.sh xxx.jar status
## 获取 java 命令的路径
JAVA_CMD=`which java`
if [ -z "${JAVA_CMD}" ];then
  echo "Please install the Java environment";
  exit 1;
fi
## 输出本命令的使用方法 并退出
usage() {
    echo "Usage: springboot-starter [app_name].jar [start|stop|restart|status]"
    exit 1
}
## 判断是否输入了两个参数
if [ $# -lt 2 ]; then
    usage
fi
## 脚本名称
APP_NAME=$1;
## 操作
OPERATION=$2;
## 运行模式
MODEL=$3;
if [ -z "$MODEL" ]; then
    MODEL="prod"
fi
## 其它参数处理
OTHER_ARGS=""
if [ $# -gt 3 ]; then
    shift 3
else
    shift $#
fi
for ARG in $*
do
  OTHER_ARGS="$OTHER_ARGS $ARG"
done
COUNT=1
RETRY=10
SLEEP=10
## 脚本所在目录,绝对路径表示
BASE_PATH=$(cd `dirname $APP_NAME`;pwd)
## 去掉所有目录后的脚本名
APP_NAME=${APP_NAME##*/}
## 脚本的路径,绝对路径表示
APP_PATH=$BASE_PATH"/"$APP_NAME
## 判断目标程序是否已经启动
is_running(){
  echo ${APP_PATH}
  ## 尝试获取已经运行程序的PID
  PID=`ps -ef|grep ${APP_PATH}|grep -v grep|grep -v starter.sh|awk '{ print $2 }'`
  echo ${PID}
  if [ -z "${PID}" ]; then
    return 0
  else
    return 1
  fi
}
## 启动程序
start(){
  is_running
  if [ $? -eq "1" ]; then
    echo "${APP_NAME} is already running. pid is ${PID} ."
    if [ $COUNT -le $RETRY ]; then
        echo "retry ${COUNT} ...... "
        COUNT=`expr $COUNT + 1`
        sleep $SLEEP
        start
    fi
  else
    ## 启动 jar 包
    echo "${APP_NAME} starting ...... "
    # java内存配置根据实际情况调整
    nohup ${JAVA_CMD} -jar -Xmx512m -Xms512m ${OTHER_ARGS}  -Dspring.profiles.active=${MODEL} ${APP_PATH} > /dev/null 2>&1 &
    echo "nohup ${JAVA_CMD} -jar -Xmx512m -Xms512m ${OTHER_ARGS} -Dspring.profiles.active=${MODEL} ${APP_PATH} > /dev/null 2>&1 &"
    sleep 1
    echo "${APP_NAME} started  completed "
    echo ""
  fi
}
## 停止程序
stop(){
  is_running
  if [ $? -eq "1" ]; then
    echo "PID is ${PID}, ${APP_NAME} stopping ...... "
    kill -9 ${PID}
    if [ $? -ne "0" ]; then
        echo "kill ${PID} failed,execute kill -9 ${PID}"
        kill -9 ${PID}
    fi
    sleep 1
    echo "${APP_NAME} stopped completed "
  else
    echo "${APP_NAME} is not running"
  fi
}
## 输出程序运行状态
status(){
  is_running
  if [ $? -eq "1" ]; then
    echo "${APP_NAME} is running. pid is ${PID}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}
## 重启程序
restart(){
  stop
  start
}
case "$OPERATION" in
  "start")
    start ;;
  "stop")
    stop ;;
  "status")
    status ;;
  "restart")
    restart ;;
  *)
    usage ;;
esac
exit 0

run.sh

#!/bin/bash
MODEL_NAME=$1
# ENV为启动环境配置,根据实际部署情况调整
ENV=${2:-dev}
# DNACOS_NAMESPACE为Nacos命名空间,根据实际部署情况调整
DNACOS_NAMESPACE=${2:-yourNacosNameSpaceName}
BASE_PATH=`pwd`
function run(){
        if [ ! -d "$MODEL_NAME" ];then
                mkdir "$MODEL_NAME"
        fi
        sh $BASE_PATH/starter.sh $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar stop
        if [ $? -eq 0 ];then
                echo "停用$MODEL_NAME"
        else
                echo "停用$MODEL_NAME失败"
        fi
        rm -rf $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar
        if [ $? -eq 0 ];then
                echo "删除$MODEL_NAME代码包"
        else
                echo "删除$MODEL_NAME代码包失败"
        fi
        cp $BASE_PATH/../package/$MODEL_NAME-1.0-SNAPSHOT.jar $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar
        if [ $? -eq 0 ];then
                echo "复制$MODEL_NAME代码包"
        else
                echo "复制$MODEL_NAME代码包失败"
                return
fi
        # dev为启动环境配置,根据实际部署情况调整
        sh $BASE_PATH/starter.sh $BASE_PATH/$MODEL_NAME/$MODEL_NAME.jar start $ENV -DNACOS_NAMESPACE=$DNACOS_NAMESPACE
        if [ $? -eq 0 ];then
                echo "启动$MODEL_NAME"
        else
                echo "启动$MODEL_NAME失败"
        fi

}
MODEL_NAME="$1"
run
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值