千家信息网

如何写出健壮可靠的shell脚本

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,如何写出健壮可靠的shell脚本,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如果秉承着能跑就行的态度写shell脚本,
千家信息网最后更新 2026年11月02日如何写出健壮可靠的shell脚本

如何写出健壮可靠的shell脚本,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

如果秉承着能跑就行的态度写shell脚本,是很自在的,但是如果你想要写出健壮,可靠的shell脚本,可没那么容易。那么有什么可操作的经验或者方法吗?

语法检查

第一个最简单的方法就是利用工具对脚本进行检查,最大程度地发现shell脚本中存在的语法错误,如果你还不知道,建议你绝对不要错过。

而为了保证脚本健壮可靠,那么就需要保证脚本在一些特殊的情况及早出现,避免漏网之鱼。来看看有哪些可行的技巧。

脚本失败时即退出

可以在脚本的开头设置如下:

set -e

举个例子:

#!/bin/bashset -elp #这里运行会出错date

这种情况下,运行一旦出错就会退出,不放过一个问题:

$ ./test.shlp: Error - no default destination available.

当然了,这也有不好的地方,有时候命令执行本来就可能是失败的,你还是希望它继续,可以临时加上|| true:

#!/bin/bashset -elp || true date

不过个人觉得这样的设置用处不是特别大,因为很多时候就是需要处理不同的错误情况,而这样只能要么遇到错误退出,要么认为正确,导致无法走到异常分支。

通过set +e设置回来:

set -e#commandset +e#other command

打印脚本执行过程

调试阶段,你可能想知道整个过程是执行了哪些命令,每条命令都具体执行了什么,可以利用下面的方式执行:

sh -x test.sh

或者,和上面类似,在开头加上set -x:

//来源:公众号【编程珠玑】//作者:守望先生#!/bin/bashset -xif [ $# -lt 1 ]then     echo "no para"else     echo "para 1 $1"fi

执行时,输出如下:

+ [ 0 -le 1 ]+ echo no parano para

前面带+的内容就是命令实际执行的,你可以看到比较条件是什么,变量被展开成了具体内容,走到了哪个分支,非常清楚。

显示未定义的变量

shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。举个例子:

//来源:公众号【编程珠玑】//作者:守望先生#!/bin/bashif [ "$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是空的时候,变成了什么?

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

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

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

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

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

set -o pipefail

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

对于静态变量使用readonly

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

MY_PATH=/usr/bin

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

readonly MY_PATH=/usr/bin

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

#!/bin/bashreadonly MY_PATH=/usr/binMY_PATH=/usr/local/bin

运行一下试试:

$ ./test.shtest.sh: 3: test.sh: MY_PATH: is read only

看,给你提示了!

给变量设置可选的初始值

例如:

name=${1:-shouwang}echo "${name}"

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

多条命令执行使用&&

例如:

cmd0;cmd1;cmd1

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

cmd0 && cmd1 && cmd1

使用函数

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

总结

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

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

脚本 命令 变量 情况 内容 错误 实际 开头 检查 健壮 实际上 就是 工具 问题 帮助 运行 清楚 作者 例子 先生 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技股互联网 互联网科技有限公司经营范围 科技类互联网 北京互联网科技 世界互联网领先科技成果 赫美联合互联网科技 掌上梦互联网科技 顺网科技2021年互联网排名 老年人脱离互联网科技的作文 哈尔滨新华互联网科技学院 宁波青枫互联网科技有限公司 电子科技大学互联网创业大赛 天津腾达互联网科技有限公司 上海钢联属于互联网科技股吗 互联网营销推广黑科技 互联网科技年终奖 2021世界互联网领先科技成果发布 互联网科技新闻 前海云享互联网科技 互联网科技快速发展优美句子 深圳九邦互联网科技有限公司 互联网科技集团 受益于互联网科技的高速发展 彤创互联网科技有限公司 智腾互联网科技有限公司 四川互联网展示科技馆设计 新氧科技和美国互联网有关系吗 西安有哪些互联网高科技企业 马化腾互联网科技教学 恒生科技互联网指数十大成分股
0