shell 执行失败重试_软件特攻队|shell脚本小技巧,教你写出健壮可靠的脚本

177e7a7d46ce6bff83c83ade2ef54735.png

作为一个程序员,写shell脚本是常有的事。然而什么样的shell脚本?什么态度去写shell脚本?是我们需要思考的事。如果抱着能跑就行的态度,也许很容易,但是从脚本的健壮性和可靠性上出发,那么就不是一件容易的事,以下是几点小技巧。

1、语法检查

这是最基本的一点,写shell脚本时,最有效的就是使用相应的工具进行语法自动补全,自动检查。这样才能最大程度发现shell脚本中存在的语法错误,

2、脚本失败时即退出

在每一个脚本头部进行如下设置:

set -e

举个例子:

#!/bin/bash

set -e

lp #这里运行会出错

date

遇到这种情况,脚本在运行时一旦出现错误就会退出;

$ ./test.sh

lp: Error - no default destination available.

当然,某些情况下,我们在执行命令遇到失败时,仍希望它继续执行下去,这时候就可以临时加上|| true;

#!/bin/bash

set -e

lp || true

date

不过这样的设置用处不大,很多时候逻辑是需要处理不同的错误情况,而这样要么错误退出,要么正确进行下去,导致无法进入异常状态的分支。

这种情况下,就可以通过set +e设置回来:

set -e

#command

set +e

#other command

3、打印脚本执行过程

代码一定会遇到调试,而要想知道脚本运行时执行了那些命令,每条命令具体执行了什么,首先可以利用以下命令来执行脚本:

sh -x test.sh

或者直接在脚本开头添加set -x:

#!/bin/bash

set -x

if [ $# -lt 1 ]

then

echo "no para"

else

echo "para 1 $1"

fi

执行时,输出如下:

+ [ 0 -le 1 ]

+ echo no para

no para

输入结果中带有+的内容就是实际执行的命令,而且可以清晰的看到比较条件,变量被展开,具体走到了那个分支。

4、显示未定义的变量

在shell中变量没有定义,而我们仍然可以使用,但是使用的结果可能不尽人意。

#!/bin/bash

if [ "$var" = "abc" ]

then

echo " not abc"

else

echo " abc "

fi

这段脚本本来想判断var的内容是否等于“abc”,而实际上并没有定义var,而脚本运行到这里并不会报错。这时候我们想早点发现这类问题,以减少在复杂的脚本中消耗的精力,可以在开头加上:

set -u

再次运行就会提示:

test.sh: 5: test.sh: num: parameter not set

再想象一下,你本来想删除:

rm -rf $dir/*

然后dir是空的时候,变成了什么?

是不是有种后背发凉的感觉?

5、管道命令一个失败时整个失败

有时候我们可能会执行类似这样的命令:

cat test.sh |grep if | cut -d ';' -f 2

三条命令一行执行,如果我们希望在其中一条失败,整个命令就失败,而避免执行后面无意义的命令,那么可以在开始设置:

set -o pipefail

不设置的情况下,cat test.sh即使执行失败了,后面的grep实际上还会继续执行,可能会导致一些意想不到的情况发生,如果不想这样的情况发生,那么这样设置是有帮助的。

6、对于静态变量使用readonly

通常我们会在脚本开头定义一些静态变量:

MY_PATH=/usr/bin

而为了避免MY_PATH被意外修改,可以这样:

readonly MY_PATH=/usr/bin

这样的话,一旦后面有命令尝试修改,就会报错。

#!/bin/bash

readonly MY_PATH=/usr/bin

MY_PATH=/usr/local/bin

运行一下试试:

$ ./test.sh

test.sh: 3: test.sh: MY_PATH: is read only

看,给你提示了!

7、给变量设置可选的初始值

例如:

name=${1:-shouwang}

echo "${name}"

这里让name为$1,即第一个参数,而当它为空时,令name为shouwang。

8、多条命令执行使用&&

例如:

cmd0;cmd1;cmd1

这里如果cmd0失败了,后面的命令仍然会执行,而如果不希望后面的命令执行,可以使用:

cmd0 && cmd1 && cmd1

9、使用函数

脚本本身比较短还好,而脚本一旦变长,不使用函数,将使得脚本很难维护,可读性也很差。

10、总结

实际上最开始介绍的脚本检查工具就已经非常有效了,基本的错误都能检查出来,而其他的内容,更多的是关注于脚本调试,不放过任何一个可能的错误。

最后,还是优先推荐shellcheck工具。

欢迎关注软件特攻队!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值