文章目录

  • 一、注释
    • `头部注释`
    • `单行注释与多行注释`
  • 二、排版规范
    • `1.程序块采用缩进,缩进为4个空格`
      • 修改vim中Tab键的距离
    • `2.函数`
      • 函数功能注释
      • 函数编写
    • `3.命令较长需分行书写,在低优先级操作符处划分新行,用'\'标识`
    • `4.一行只写一条语句`
    • `5.逻辑运算符&&、||和重定向、管道符前后要留空格`
    • `6.一个函数只完成一个功能,且不能超过100行`
    • `7.case语句格式`
    • `8.注释与上面的代码用空行隔开`
    • `9.循环和判断`
      • for循环
      • while
  • 三、变量规范
    • `1.变量名由字母、数字、下划线组成, 只能以字母、下划线开头`
    • `2.尽量减少全局变量,可在变量前面加local使其成为局部变量`
    • `3.环境变量和全局变量大写,局部变量小写(使用下划线连接,如host_ip )`
      • declare解释
    • `4.引用变量用\${value}`
    • `4.不能被清除和修改的变量通过readonly variable声明`
    • `5.常用变量集中写在脚本开头,便于修改`
    • `6.对变量赋空值时,建议使用unset`
    • `7.用ln创建软链接文件,必须先判断文件是否存在,存在时必须先删除,然后再创建软链接`
    • `8.命令替换推荐使用$(),并用双引号括起来,在groovy中建议使用``(反撇号)`
  • 四、安全清理
    • `1.环境变量和history不能有敏感信息`
  • 五、建议
  • 参考文章


俗话说“无规矩不成方圆”,虽然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到父目录,再删除子目录

参考文章

Linux Shell 脚本编程最佳实践
在线检查shell的工具

更多推荐

Shell脚本编程规范