Windows下Shell脚本运行错误展示错误信息并停止向下执行

字数 475阅读 1263

shell脚本运行完毕之后会直接关闭窗口,不便于开发者查看运行结果,这点可以通过sleep来实现暂停

新建脚本 demoshell

#!/usr/bin/env bash

#获取传入的第一个参数
parmas1=$1

echo "params1= ${parmas1}"

在命令窗口执行demoshell.sh xxxxx,会启动 shell窗口 ,打印params1= xxxxx之后就会关闭窗口

想要不关闭窗口可以在脚本的最后添加 sleep 来实现。
例如

#!/usr/bin/env bash

#获取传入的第一个参数
parmas1=$1

echo "params1= ${parmas1}"

#表示沉睡100秒,Ctrl + C 可以打断沉睡状态
sleep 100

再次执行demoshell.sh xxxxx,执行完毕之后,窗口不会直接关闭,可以查看运行结果

截图_20171223160820.png

shell脚本还有一个不好的地方就是中间的一个命令运行失败之后还会继续向下执行,这是一个很危险的行为,并且向下执行的时候会冲掉失败信息,无法根据错误提示来修改脚本。

接下来执行一个不存在的任务,让shell脚本运行失败

#!/usr/bin/env bash

#获取传入的第一个参数
params1=$1

echo "params1= ${params1}"

# 执行一个不存在的任务
./gradlew :app:emptyTask -x lint

#表示沉睡100秒,Ctrl + C 可以打断沉睡状态
sleep 100
截图_20171223164358.png

执行失败之后由于sleep 100 ,可以看到错误提示,如果没有sleep 100存在,执行失败之后也是立马关闭了窗口,看不到错误信息;而命令执行成功之后需要关闭窗口的,那能不能想办法做到两者兼顾呢?
答案是肯定的,原理就是判断命令执行状态,只有在命令执行失败的时候,触发sleep行为,阻塞命令向下运行

那么最终要实现的效果是:
  • 执行失败的时候显示错误信息,并停止向下执行
  • 执行成功的时候可以直接关闭shell窗口
#!/usr/bin/env bash

# 判断上条命令是否执行成功,当执行失败的时候显示错误信息,并停止向下执行
function pauseErr(){
    if [ $? -ne 0 ];then
        echo "pause because of failed ; Ctrl + C to exit"
        #沉睡100秒,以便查看异常信息
        sleep 100  
        #当调用者使用Ctrl + C打断沉睡之后,直接退出脚本,阻止脚本向下执行
        exit
    fi
}

#获取传入的第一个参数
params1=$1

echo "params1= ${params1}"

# 执行一个不存在的任务
./gradlew :app:emptyTask -x lint

#调用PauseErr函数判断上条命令是否执行成功
pauseErr

去掉 sleep 100,运行脚本,捕获到失败信息,显示错误信息,并停止向下执行

截图_20171223164726.png

注释掉./gradlew :app:emptyTask -x lint;
再次运行脚本,运行成功,直接就关闭了窗口