转载地址: https://mp.weixin.qq.com/s/YmROxFBkfMxuh_VaaI4wtg
【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 #脚本的用途
3 #脚本的注意事项
4 #脚本的写作时间,作者,版权等
5 #各个函数前的说明注释6 #一些较复杂的单行命令注释
2
脚本中有命令运行失败时退出脚本
如果脚本中某条命令运行失败,我们不应该让其继续运行,因为这样可能会影响脚本的其余部分,导致逻辑错误。逻辑错误一般又是很难定位的,与其这样,不如让其提前结束更早的找出脚本中的错误。可以用下面的命令设置在遇到命令失败时来退出脚本执行:
# 如果命令运行失败让脚本退出执行
set -o errexit
# 或
set -e
set -o errexit
# 或
set -e
3
脚本中使用到未声明变量时退出脚本
脚本中使用到未声明的变量同样可能导致逻辑错误,可以用下面的命令设置脚本在使用到未声明的变量时退出执行:
# 若有用未设置的变量即让脚本退出执行
set -o nounset
# 或
set-u
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
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
5
在脚本中多使用函数
同样,这条建议也适用其它编程语言,函数的使用使得代码更模块化,更可读和可重用;shell脚本中定义函数的语法如下所示:
function check_root()
{
command1;
command2;
}
# 或
check_root()
{
command1;
command2;
}
{
command1;
command2;
}
# 或
check_root()
{
command1;
command2;
}
6
字符串比较时用=而不是==
为什么会有这个建议,原文并没有给出详细的说明,只是简单的提了句: ==
是 =
的同义词,因此仅用个单个 =
来做字符串比较。不过在原文的后面有网友回答了,是因为==只适用于bash;POSIX形式是“=”,使用 = 更方便移植。
value1="tecmint.com"
value2="fossmint.com"
if [ "$value1" = "$value2" ]
value2="fossmint.com"
if [ "$value1" = "$value2" ]
7
用$(command) 代替传统的`command`
这两种形式都可以用作命令替换,所谓命令替换是用这个命令的输出结果取代命令本身。这里建议用 $(command)
而不是反引号 `command
`来做命令代换。
command
//不建议做法
user=`echo "$UID"`
建议做法user=
$(echo "$UID")
user=`echo "$UID"`
建议做法user=
$(echo "$UID")
8
用readonly声明静态变量
静态变量不会改变;它的值一旦在脚本中定义后就不能被修改,对于这类变量,在声明的时候应该用readonly去声明。
readonly passwd_file="/etc/passwd"
readonly group_file="/etc/group"
readonly group_file="/etc/group"
9
命名规范
由于在bash环境变量名字都是大写,因此建议自己定义的变量用小写字母命名,以防止命名冲突,同时命名时要做到顾名思义,你取的名字要有意义。
#而环境变量用大写命名,自定义变量用小写,
nikto_file="$HOME/Downloads/nikto-master"
nikto_file="$HOME/Downloads/nikto-master"