文章目录
- 一、注释
- 二、排版规范
- 三、变量规范
- 四、安全清理
- 五、建议
- 参考文章
俗话说“无规矩不成方圆”,虽然Shell是一门自由度很高的语言,没有严格的缩进要求、使用变量不需要事先声明、赋值即确定数据类型,但是按照适当的规范会使代码看起来美观、易于维护、易于看懂,下面根据个人经验总结了一些编程规范。
一、注释
头部注释
#!/bin/bash
# vim:sw=4:ts=4:et
<<INFO
SCRIPYT:test.sh
AUTHOR:anqixiang<邮箱号>
DATE:2021-09-12
DESCRIBE:描述脚本主要功能
SYSTEM:适配哪些操作系统
WARNING:警告信息
VERSION:1.1.0<可选>
MODIFY:记录修改信息,方便查看和维护
INFO
单行注释与多行注释
单行注释以#号开头,如
#修改IP地址
多行注释表示方法(INFO可以用别的标识代替,但需与结尾保持一致)
<<INFO
SCRIPYT:test.sh
AUTHOR:anqixiang<邮箱号>
DATE:2021-09-12
INFO
二、排版规范
1.程序块采用缩进,缩进为4个空格
修改vim中Tab键的距离
举例
while true
do
sleep 5
done
2.函数
函数功能注释
所有的函数注释应该包含:
- 函数的描述
- 全局变量的使用和修改
- 使用的参数说明
- 返回值,而不是上一条命令运行后默认的退出状态
示例:
#######################################
# Cleanup files from the backup dir
# Globals:
# BACKUP_DIR
# BACKUP_SID
# Arguments:
# None
# Returns:
# None
#######################################
cleanup() {
...
}
函数编写
函数首字母大写,并用“_”隔开,如Modify_Ip
函数名后面必须加小括号()
第一个大括号与小括号之间保留一个空格
第二个大括号顶格单独占一行
同级别的代码块要左对齐
举例
Modify_Ip() {
command1
command2
if 表达式;then
command 3
else
command 4
fi
}
3.命令较长需分行书写,在低优先级操作符处划分新行,用'\'标识
command 1 | command 2 \
&& command 3 \
|| command 4
4.一行只写一条语句
command 1;command 2 #不推荐
command 1 #推荐
command 2
5.逻辑运算符&&、||和重定向、管道符前后要留空格
command 1 && command 2
command 1 | command 2
# 长命令管道换行连接,管道放置于下一个命令开头,缩进4个空格
command1 \
| command2 \
| command3 \
| command4
6.一个函数只完成一个功能,且不能超过100行
7.case语句格式
case $value in
val1)
command 1
;;
a|b)
command 2
;;
*)
command 3
esac
8.注释与上面的代码用空行隔开
command 1
[空一行]
#注释内容
command 2
9.循环和判断
for循环
for i in 1..3
do
if [[ $i -eq 1 ]];then
echo "等于1"
elif [[ $i -eq 2 ]];then
echo "等于2"
else
echo "等于3"
fi
done
while
while read line
do
...
done < file.txt
或者
command | while read line
do
...
done
三、变量规范
1.变量名由字母、数字、下划线组成, 只能以字母、下划线开头
2.尽量减少全局变量,可在变量前面加local使其成为局部变量
local name=""
for name in a b
do
echo ${name}
done
全局变量仅在当前Shell有效,使用export定义的全局变量在所有子进程中依然有效
3.环境变量和全局变量大写,局部变量小写(使用下划线连接,如host_ip )
readonly PATH_TO_FILES='/some/path' #不能修改的变量添加readonly 属性
declare -xr BACKUP_SID='PROD'
declare解释
功能介绍:声明变量的属性,如果使用declare,后面没有任何参数,那么bash就会主动将所有变量名与内容都调出来,just as set.
语 法:declare [-aixr] variable
参数说明:
-a :将后面的variable定义为数组
-i :将后面的variavle定义为整数数字
-x :用法与export一样,就是将后面的variable变成环境变量
-r :将一个variable的亦是设置成只读,读变量不可更改内容,也不能unset
4.引用变量用\${value}
val=${value}
[[ ${value} == "test" ]] && command 1
4.不能被清除和修改的变量通过readonly variable声明
5.常用变量集中写在脚本开头,便于修改
6.对变量赋空值时,建议使用unset
unset sum
7.用ln创建软链接文件,必须先判断文件是否存在,存在时必须先删除,然后再创建软链接
[ -h /data ] && rm -rf /data
ln -sf /home/data /data
8.命令替换推荐使用$(),并用双引号括起来,在groovy中建议使用``(反撇号)
local_ip="$(ip addr | grep ......)"
四、安全清理
1.环境变量和history不能有敏感信息
五、建议
- 判断推荐使用[[ ]]
- 判断命令是否存在用command -v代替which(command是内部命令,系统自带;如果命令不存在不会输出任何信息)
- 路径尽量保持绝对路径,不易出错,如果非要用相对路径,最好用./修饰
- 简单的if尽量使用&& ||,写成单行。比如[[ x > 2]] && echo x
- 使用rm删除目录的时候建议先cd到父目录,再删除子目录