Shell脚本编程规范

Shell脚本编程规范文章目录一 注释 头部注释 单行注释与多行注释 二 排版规范 1 程序块采用缩进 缩进为 4 个空格 修改 vim 中 Tab 键的距离 2 函数编写 3 命令较长需分行书写 在低优先级操作符处划分新行 用 标识 4 一行只写一条语句 5 逻辑运算符 amp amp 和重定向 管道符前后要留空格 6 一个函数只完成一个功能 且不能超过 100 行 7 case 语句格式 8 注释与上面的代码用空行隔开 三 变量规范 1 变量名由字母 数字 下划线组成 只能以字母 下划线开头 2 尽量减少全局变量


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

参考文章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229852.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:43
下一篇 2026年3月16日 下午3:44


相关推荐

  • toString方法重写

    toString方法重写Student 类 折叠起来的就是普通的 get set 方法 因为 syso 打印方法中调用的 Object toString 方法 当你重写 toString 方法 会覆盖 Object toString 方法 及会输出你重写的 toString 方法 以下为详解 1 未重写 toString 打印对象输出结果 进入 println 方法 看到调用了 String valueOf 进入 String valueOf 方法看到不为空调用 Object toString 方法 进入 Object

    2026年3月17日
    2
  • react router 路由守卫_React路由鉴权的实现方法「建议收藏」

    react router 路由守卫_React路由鉴权的实现方法「建议收藏」前言上一篇文章中有同学提到路由鉴权,由于时间关系没有写,本文将针对这一特性对vue和react做专门说明,希望同学看了以后能够受益匪浅,对你的项目能够有所帮助,本文借鉴了很多大佬的文章篇幅也是比较长的。背景单独项目中是希望根据登录人来看下这个人是不是有权限进入当前页面。虽然服务端做了进行接口的权限,但是每一个路由加载的时候都要去请求这个接口太浪费了。有时候是通过SESSIONID来校验登陆…

    2022年6月8日
    133
  • RARP_arp协议主要用来

    RARP_arp协议主要用来ARP的工作原理如下:1.首先,每台主机都会在自己的ARP缓冲区(ARPCache)中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。2.当源主机需要将一个数据包要发送到目的主机时

    2022年8月5日
    9
  • j2ee java是什么意思,j2ee是什么

    j2ee java是什么意思,j2ee是什么熟悉Java的人有很多,但对于j2ee,很多人估计都是次听说了。那么这个j2ee是什么呢?它和Java有着什么千丝万缕的联系呢?1、j2ee是什么?要想知道j2ee是什么,必须先知道Java的三大分支。Java分为三个体系,分别为JavaSE(标准版),JavaEE(企业版),JavaME(微型版)这样看来的话,j2ee是属于java三大分支的一个。j2ee是一套全然不同于传统应用开发的技术架…

    2022年10月11日
    6
  • VMware安装Centos7超详细过程(图文)[通俗易懂]

    VMware安装Centos7超详细过程(图文)[通俗易懂]原文:https://www.jianshu.com/p/ce08cdbc4ddb?utm_source=tuicool&utm_medium=referral本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下1.软硬件准备软件:推荐使用VMwear,我用的是VMwear12镜像:CentOS7,如…

    2022年4月27日
    34
  • c# 将十进制数字转换成字节数组

    c# 将十进制数字转换成字节数组

    2021年9月11日
    215

发表回复

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

关注全栈程序员社区公众号