【Linux命令】 linux下高效编写shell脚本的10个建议

>>2020,微服务装逼指南
【Linux命令】 linux下高效编写shell脚本的10个建议


注:此文转载于公众号 码农有道


在Linux环境下工作 ,shell脚本的编写应该是一个必备的基本技能了,本文将分享 10 个写出高效可靠的 shell脚本的实用技巧

本文主要内容来源于10 Useful Tips for Writing Effective Bash Scripts in Linux》,再加上自己的一点理解而成。如果你还有一些其他更好的脚本编程经验想要分享,在下面评论框分享出来吧。



1
在脚本中多写注释

这条建议不但适合于shell脚本,对于其它编程语言同样实用。这样做的好处是可以帮助他人或者你自己后面阅读脚本时能够迅速了解脚本的功能,便于维护。试想下,如果有一天你的主管给了你一堆没有注释的代码,你是不是很抓狂呢。

shell脚本中,注释一般以#开头,后面跟着是注释的内容。注释不可少,但是注释也不是越多越好,对于shell脚本,注释一般包括下面几个部分:

1 #脚本的参数
2 #脚本的用途
3 #脚本的注意事项
4 #脚本的写作时间,作者,版权等
5 #各个函数前的说明注释6 #一些较复杂的单行命令注释



2
脚本中有命令运行失败时退出脚本

如果脚本中某条命令运行失败,我们不应该让其继续运行,因为这样可能会影响脚本的其余部分,导致逻辑错误。逻辑错误一般又是很难定位的,与其这样,不如让其提前结束更早的找出脚本中的错误。可以用下面的命令设置在遇到命令失败时来退出脚本执行:

# 如果命令运行失败让脚本退出执行
set -o errexit

# 或
set -e



3
脚本中使用到未声明变量时退出脚本

脚本中使用到未声明的变量同样可能导致逻辑错误,可以用下面的命令设置脚本在使用到未声明的变量时退出执行:

# 若有用未设置的变量即让脚本退出执行
set -o nounset

# 或
set-u



4
使用双引号引用变量

使用一个变量的值时,用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配,下面的例子说明了一切。

#!/bin/bash# 若命令失败让脚本退出
set -o errexit

# 若未设置的变量被使用让脚本退出
set -o nounset

echo
"Names without double quotes"
echo
names
="Tecmint FOSSMint Linusay"
for name in $names; do echo "$name
done
echo
echo
"Names with double quotes"
echo
for name in "$names"; do echo "$name"
done
exit 0

【Linux命令】 linux下高效编写shell脚本的10个建议



5
在脚本中多使用函数

同样,这条建议也适用其它编程语言,函数的使用使得代码更模块化,更可读和可重用;shell脚本中定义函数的语法如下所示:

function check_root()
{

   command1;    
   command2;
}

# 或
check_root()
{    
   command1;
   
   command2;
}


6
字符串比较时用=而不是==

为什么会有这个建议,原文并没有给出详细的说明,只是简单的提了句: == 是 = 的同义词,因此仅用个单个 = 来做字符串比较。不过在原文的后面有网友回答了,是因为==只适用于bash;POSIX形式是“=”,使用 = 更方便移植。

value1="tecmint.com"
value2
="fossmint.com"
if [ "$value1" = "$value2" ]


7
用$(command) 代替传统的`command`

这两种形式都可以用作命令替换,所谓命令替换是用这个命令的输出结果取代命令本身。这里建议用 $(command) 而不是反引号 `command `来做命令代换。

//不建议做法
user=`echo "$UID"`

建议做法user=
$(echo "$UID")


8
用readonly声明静态变量

静态变量不会改变;它的值一旦在脚本中定义后就不能被修改,对于这类变量,在声明的时候应该用readonly去声明。

readonly passwd_file="/etc/passwd"
readonly group_file="/etc/group"


9
命名规范

由于在bash环境变量名字都是大写,因此建议自己定义的变量用小写字母命名,以防止命名冲突,同时命名时要做到顾名思义,你取的名字要有意义。

#而环境变量用大写命名,自定义变量用小写,
nikto_file="$HOME/Downloads/nikto-master"


10
对比较长的脚本进行调试

当你的脚本有成千上万行时,一旦脚本运行出错,排错是一件异常困难的事情;为了在脚本执行前更轻松地将问题定位出,需要进行一些调试,下面是一些指南来帮助你掌握调试的技巧。

How To Enable Shell Script Debugging Mode in Linux

How to Perform Syntax Checking Debugging Mode in Shell Scripts

How to Trace Execution of Commands in Shell Script with Shell Tracing


参考资料

10 Useful Tips for Writing Effective Bash Scripts in Linux

推荐阅读

+


图解菜鸟到大拿实现财务自由走向人生巅峰之路

TB级(小白到大牛之路)技术视频资源福利大放送

助力你的年度大戏:“金三银四”的折腾

“金三银四”的折腾之聊一聊面试

MySQL 主从同步架构中你不知道的“坑”

开源组件ELK日志系统配置与管理

浅谈MySQL集群高可用架构


·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧

【Linux命令】 linux下高效编写shell脚本的10个建议

超过10000+万人正在关注

【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议
【Linux命令】 linux下高效编写shell脚本的10个建议

专注于Linux系统运维、运维架构、各类高可用架构技术,热衷于分享开源技术,热爱开源、拥抱开源,我是80后民工哥,微信公众号:民工哥Linux运维,我为自己带盐,谁说80后不能活出精彩人生!!!

关注公众号后台回复 “入群” 索取入群方式

长按关注公众号
【Linux命令】 linux下高效编写shell脚本的10个建议