看完这篇,写的Shell脚本更加健壮了!

[[356512]]

本文转载自微信公众号「编程珠玑」,作者守望先生 。转载本文请联系编程珠玑公众号。  

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

语法检查

第一个最简单的方法就是利用工具对脚本进行检查,这一部分已经在《有了这个神器,再也不怕shell写不对了》中介绍过了,它能最大程度地发现shell脚本中存在的语法错误,如果你还不知道,建议你绝对不要错过。

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

脚本失败时即退出

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

  1. set -e 

举个例子:

  1. #!/bin/bash 
  2. set -e 
  3. lp    #这里运行会出错 
  4. date 

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

  1. $ ./test.sh 
  2. lp: Error - no default destination available. 

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

  1. #!/bin/bash 
  2. set -e 
  3. lp  || true   
  4. date 

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

通过set +e设置回来:

  1. set -e 
  2. #command 
  3. set +e 
  4. #other command 

打印脚本执行过程

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

  1. sh -x test.sh 

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

  1. //来源:公众号【编程珠玑】 
  2. //作者:守望先生 
  3. #!/bin/bash 
  4. set -x 
  5. if [ $# -lt 1 ] 
  6. then 
  7.    echo  "no para" 
  8. else 
  9.    echo "para 1 $1" 
  10. fi 

执行时,输出如下:

  1. + [ 0 -le 1 ] 
  2. + echo no para 
  3. no para 

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

显示未定义的变量

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

  1. //来源:公众号【编程珠玑】 
  2. //作者:守望先生 
  3. #!/bin/bash 
  4. if [ "$var" = "abc" ] 
  5. then 
  6.    echo  " not abc" 
  7. else 
  8.    echo " abc " 
  9. fi 

这里本来想判断var的内容是否为abc,实际上var并没有定义,但是在这里使用并没有报错,如果我们想早点发现这类问题,避免在复杂的脚本中问题被掩盖,那么可以在开头加上

  1. set -u 

再次运行就会提示:

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

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

  1. rm -rf $dir/* 

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

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

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

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

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

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

  1. set -o pipefail 

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

对于静态变量使用readonly

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

  1. MY_PATH=/usr/bin 

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

  1. readonly MY_PATH=/usr/bin 

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

  1. #!/bin/bash 
  2. readonly MY_PATH=/usr/bin 
  3. MY_PATH=/usr/local/bin 

运行一下试试:

  1. $ ./test.sh 
  2. test.sh: 3: test.sh: MY_PATH: is read only 

看,给你提示了!

给变量设置可选的初始值

例如:

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

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

多条命令执行使用&&

例如:

  1. cmd0;cmd1;cmd1 

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

  1. cmd0 && cmd1 && cmd1 

使用函数

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

总结

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

最后,还是优先推荐shellcheck工具。地址:https://www.shellcheck.net

作者:守望,linux应用开发者,目前在公众号【编程珠玑】?分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。

原文链接:https://mp.weixin.qq.com/s/EpCoiHHpCdPcj8kkeRjHjw

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/127569.html<

(0)
管理的头像管理
上一篇2025-02-24 17:59
下一篇 2025-02-24 18:00

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注