记一次符合Google Coding Style的Bash脚本重构

news2024/11/20 4:48:26

最近我在思考这样一个问题,顺便看一下gpt对这个问题的解释。搜索发现:

团队写代码,为什么要遵循coding guideline?

  1. 一致性:编码准则确保整个团队的代码风格和格式是一致的,这使得团队成员之间更易于交流和协作。这也使得代码更容易维护和更新,因为其他人可以更轻松地理解代码。
  2. 可读性:编码准则有助于提高代码的可读性。通过对代码进行格式化和注释,代码会更易于阅读和理解,从而减少错误和缺陷,并提高代码的质量。
  3. 可维护性:编码准则有助于提高代码的可维护性。通过使用一致的格式和风格,团队成员可以更轻松地理解代码,并进行更快速的故障排除和修复。
  4. 代码质量:编码准则有助于提高代码的质量。通过要求团队成员编写可读性高、可维护性强的代码,编码准则可以确保代码更加健壮、可靠和安全。这也有助于减少代码缺陷和错误,提高代码的可靠性和可用性。
  5. 代码重用:编码准则有助于提高代码的重用性。通过编写符合标准的代码,团队成员可以更容易地将代码重用在其他项目中,从而提高生产力和效率。

继续搜索:

对于一个使用bash为主要语言的项目,业界推荐的coding guideline?

  1. 使用有意义的变量名:变量名应该具有描述性,以便其他人可以轻松地理解代码。
  2. 缩进:使用4个空格作为缩进,而不是制表符。
  3. 注释:对代码进行注释,以解释代码的目的和功能。注释应该清晰、简洁,并且易于阅读。
  4. 函数:编写短小精悍的函数,每个函数都应该具有一个特定的目的。函数应该使用有意义的名称,并且应该清晰地描述其目的和功能。
  5. 错误处理:在代码中包含错误处理,以确保代码在遇到错误时不会崩溃或产生不可预测的结果。
  6. 使用双引号:在引用变量时,使用双引号而不是单引号,以确保变量扩展能够正常工作。
  7. 使用全局变量:尽量避免使用全局变量,因为它们很难调试和维护。
  8. 使用命令替换:使用$()语法而不是反引号 ``来执行命令替换。
  9. 使用数组:使用数组来管理相关变量,而不是使用多个单独的变量。
  10. 使用“set -u”:使用“set -u”来检查未定义的变量,以避免在引用未定义的变量时产生错误。

这些规范有助于提高 Bash 代码的可读性、可维护性和可靠性。
然后我搜索 “bash script style guideline”,最上面的结果是:
在这里插入图片描述

即代码规范:https://google.github.io/styleguide/shellguide.html
我仔细阅读了这份风格指南,对其中的“局部变量”的章节很感兴趣。
文中说:「最好把局部变量的定义与赋值,换行实现,不要写到同一行上」,以免掩盖报错状态码。
原文

Declare function-specific variables with local. Declaration and assignment should be on different lines.
Ensure that local variables are only seen inside a function and its children by using local when declaring them. This avoids polluting the global name space and inadvertently setting variables that may have significance outside the function.
Declaration and assignment must be separate statements when the assignment value is provided by a command substitution; as the local builtin does not propagate the exit code from the command substitution.

我动手验证这个细节,发现果然如此:
在这里插入图片描述

然后我开始自查当前的项目,寻找类似于如下风格的代码:

local my_var="$(my_func)"

优化后的预期结果:

local my_var
my_var="$(my_func)"

在 https://regex101.com/ 测试代码的运行。给出范例

regex:  
  local fn=$(echo $name_ver| tr ':' '-').tar.xz
test string
  local fn=$(echo $name_ver| tr ':' '-').tar.xz     #普通
    local fn=$(echo $name_ver| tr ':' '-').tar.xz   # 模拟多个空格
    local fn=$(echo $name_ver| tr ':' '-').tar.xz       # 模拟tab缩进
    local fn="$(echo $name_ver| tr ':' '-').tar.xz" # 模拟带引号的变量声明

测似乎生成的代码

$1local $2\n$1$2=$3

生成的代码

$re = '/^(\s*)local\s+(\w+)=("?\$\(.*)/m';
$str = '  local fn=$(echo $name_ver| tr \':\' \'-\').tar.xzt
    local fn=$(echo $name_ver| tr \':\' \'-\').tar.xzt
    local fn=$(echo $name_ver| tr \':\' \'-\').tar.xz
    local fn="$(echo $name_ver| tr \':\' \'-\').tar.xz"';
$subst = "$1local $2\n$1$2=$3";

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;

精简为 perl_oneliner:
在这里插入图片描述

perl -pe 's/^(\s*)local\s+(\w+)=("?\$\(.*)/$1local $2\n$1$2=$3/g' -i file.txt

测试的场景:
搜索代码

pcregrep -lr '^(\s*)local\s+(\w+)=("?\$\(.*)' *

批量修正:

perl -pi -e 's#^(\s*)local\s+(\w+)=("?\$\(.*)#$1local $2\n$1$2=$3#' $(pcregrep -l -r '^(\s*)local\s+(\w+)=("?\$\(.*)' * )

修正之后,仔细阅读diff,检验效果,发现符合预期。

后续:增加git hook检测代码

为了让以后新增的代码,也都符合上述规范,我增加了这样一个 pre-commit脚本。这样,每次提交之前,它都会帮我确保代码合规。

同时,我在编辑器里,设置了shfmt、shellcheck之类的规范,并设置为format on save,即保存时自动格式化,来自动处理格式问题。

# test code 
if ! grep -wq 'Code violates rules' .git/hooks/pre-commit; then
cat >> .git/hooks/pre-commit <<'GIT_PRE_COMMIT_EOF'                                                                                                                                        
#!/usr/bin/env bash
if find . -name '*.sh'| xargs pcregrep '^\s+local\s+\w+="?(`|\$\()'; then
  echo "Error: Code violates rules"
  echo 'use: local var'
  echo 'var="$(...")'
  echo 'instead of local var=``'
  echo 'or local var="$(...)"'
  echo 'as of explained in https://google.github.io/styleguide/shellguide.html'
  exit 1
fi
GIT_PRE_COMMIT_EOF
chmod +x .git/hooks/pre-commit
fi

总结:

  • 寻找业界规范
  • 遵循规范
  • 修改过去不合规范的代码
  • 新增代码确保合规
  • 将代码的规范检查,加入到日常的流程里。(goimport check)
  • 越早做,历史包袱越少。越晚做,历史包袱越沉重。
  • related PR: https://git.yunion.io/projects/CLOUD/repos/yunion-build/pull-requests/1355/diff#main.sh

links

  • Checks · koalaman/shellcheck Wiki
  • ShellCheck - A shell script static analysis tool
  • styleguide | Style guides for Google-originated open-source projects*
  • regex101: build, test, and debug regex

以上是文章的主要内容,作为融合云/多云管理/私有云/FinOps 厂商,云联壹云会持续关注这些领域的动态,分享相关的信息和技术,可以通过的官网(yunion.cn)或关注的公众号(云联壹云)来获取最新的信息,感谢大家的时间。

原文地址:https://www.yunion.cn/article/html/20230524.html

其他推荐阅读

云联壹云融合云管理平台的 10 大应用场景
SkyPilot:构建在多云之上的ML和数据科学,可节约3倍以上成本
Flexera 2023 云状态报告解读
新品发布 | Cloudpods 3.10版本上线!
企业面对FinOps,到底能做些什么?总结了4个方面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型&#xff0c;在本文中&#xff0c;我们将学习如何使用PyTorch搭建卷积神经网络ResNet模型&#xff0c;并在生成的假数据上进行训练和测试。本文将…

Linux---vi/vim编辑器、查阅命令

1. vi\vim编辑器三种模式 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而且还具有 shell 程序编辑的功能&#xff0c; 可以不同颜色的字体来辨别语法的正确性&#xff0c;极大方便了程序的设计和编辑性。 命令模式&#xff08…

整数智能重磅推出集成SAM的智能标注工具2.0

前言 图像语义分割一直是数据标注中最繁琐、最耗时的标注任务之一&#xff0c;利用钢笔工具手动描边的标注方式所带来的时间成本和低准确率都将影响模型的生产速度和模型性能。整数智能ABAVA数据工程平台最新发布了基于SAM&#xff08;Segement Anything Model&#xff09;改进…

【面试题】面试题总结

加油加油 文章目录 1. TCP与UDP的区别2. TCP为什么是四次挥手机制3. HTTP与HTTPS的区别4. HTTPS加密机制5. 简要介绍SSL/TSL协议6. GET与POST的区别7. cookie与session的区别8. JVM内存区域划分9. 程序运行时候内存不足&#xff0c;会出现什么状况10. 显式调用GC会立即执行吗11…

【Python json】零基础也能轻松掌握的学习路线与参考资料

Python中的JSON模块主要用于将Python对象序列化成JSON数据或解析包含JSON数据的字符串。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。由于JSON在Web应用中的广泛使用…

SpringCloud Sentinel实战限流熔断降级应用

目录 1 Sentinel核心库1.1 Sentinel介绍1.2 Sentinel核心功能1.2.1 流量控制1.2.2 熔断降级 2 Sentinel 限流熔断降级2.1 SentinelResource定义资源2.2 Sentinel的规则2.2.1 流量控制规则 (FlowRule)2.2.2 熔断降级规则 (DegradeRule)2.2.3 系统保护规则 (SystemRule)2.2.4 访问…

Tomcat配置https协议证书-阿里云,Nginx配置https协议证书-阿里云,Tomcat配置https证书pfx转jks

Tomcat/Nginx配置https协议证书 前言Tomcat配置https协议证书-阿里云方式一 pfx配置证书重启即可 方式二 jkspfx生成jks配置证书重启即可 Nginx配置https协议证书-阿里云实现方式重启即可 其他Tomcat相关配置例子如下nginx配置相关例子如下 前言 阿里云官网&#xff1a;https:…

探索Java面向对象编程的奇妙世界(三)

⭐ 垃圾回收机制(Garbage Collection)⭐ JVM 调优和 Full GC⭐ this 关键字⭐ static 关键字 ⭐ 垃圾回收机制(Garbage Collection) Java 引入了垃圾回收机制&#xff0c;令 C程序员最头疼的内存管理问题迎刃而解。Java 程序员可以将更多的精力放到业务逻辑上而不是内存管理工…

网安面试只要掌握这十点技巧,绝对轻轻松松吊打面试官

结合工作经验&#xff0c;在这里笔者给企业网管员提供一些保障企业网络安全的建议&#xff0c;帮助他们用以抵御网络入侵、恶意软件和垃圾邮件。 定义用户完成相关任务的恰当权限 拥有管理员权限的用户也就拥有执行破坏系统的活动能力&#xff0c;例如&#xff1a; ・偶然对系…

挂耳式耳机品牌排行榜,良心推荐这四款蓝牙耳机

在蓝牙耳机越来越普及的同时&#xff0c;大家开始重视佩戴耳机时的舒适度&#xff0c;市面上的耳机形式也逐步迭代&#xff0c;目前流行的开放式耳机不仅很好的避免长期佩戴耳机产生的酸痛感&#xff0c;而且对耳道健康问题的处理也具有极佳的效果。那么&#xff0c;面对市面上…

VB显示“shell32.dll”中的图标

在Form上添加一个ListBox列表控件 代码如下&#xff1a; Option Explicit Private Declare Function ExtractIconEx Lib “shell32.dll” Alias “ExtractIconExA” (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nI…

奇偶分频电路

目录 偶数分频 寄存器级联法 计数器法 奇数分频 不满足50%占空比 50%占空比 偶数分频 寄存器级联法 寄存器级联法能实现2^N的偶数分频&#xff0c;具体做法是采用寄存器结构的电路&#xff0c;每当时钟上升沿到来的时候对输出结果进行翻转&#xff0c;以此来实现偶数分…

拥有自我意识的AI:AutoGPT | 得物技术

1.引言 ChatGPT在当下已经风靡一时&#xff0c;作为自然语言处理模型的佼佼者&#xff0c;ChatGPT的优势在于其能够生成流畅、连贯的对话&#xff0c;同时还能够理解上下文并根据上下文进行回答。针对不同的应用场景可以进行快速定制&#xff0c;例如&#xff0c;在客服、教育…

【Unity-UGUI控件全面解析】| TextMeshPro 控件详解

🎬【Unity-UGUI控件全面解析】| TextMeshPro控件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 Font Asset Creator 面板介绍4.2 制作中文字体库五、组件相关扩展使用5.1 软化/扩张 效果5.2 描边效果5.3 投影效果5.4 光照效果5.5 外发光效果💯…

5.25 费解的开关

思路&#xff0c;枚举 开关按下两次就复原&#xff0c;所以一个开关只有两种情况&#xff0c;按下和不按下&#xff0c;5*5的开关&#xff0c;一共25个开关&#xff0c;一共有2^25种情况&#xff0c;for (int i 0;i < 2^25;i)进行操作&#xff0c;计算按下开关次数&#x…

mac 安装 MongoDB

一.官网下载安装包 1.1 下载安装包 Download MongoDB Community Server | MongoDB 1.2 将下载好的 MongoDB 安装包解压缩&#xff0c;并将文件夹名改为 mongodb&#xff08;可改成自己想要的任何名字&#xff09;。 1.3 按快捷键 Command Shift G 打开前往文件夹弹窗&#…

没有经验能做产品经理吗?

没有经验能做产品经理吗&#xff1f;这是一个经常被讨论的问题&#xff0c;因为很多人想转行成为产品经理&#xff0c;但他们没有相关的工作经验。这里我也给出一些解答。 一、产品经理的职责和技能 首先&#xff0c;让我们看一下产品经理的职责和技能。产品经理是负责产品开…

LeetCode:相交链表(java)

相交链表 题目描述指针法解题 #LeetCode 160题&#xff1a;相交链表&#xff0c;原题链接 原题链接。相交链表–可以打开测试 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返…

【Python Power BI】零基础也能轻松掌握的学习路线与参考资料

Python和Power BI是现代数据分析和可视化领域中最受欢迎的工具之一&#xff0c;Python是一种高级编程语言&#xff0c;广泛用于数据科学和分析&#xff0c;而Power BI是一种业务智能工具&#xff0c;用于创建交互式大屏幕和实时报表。Python和Power BI的结合使用可以为数据科学…

【布隆过滤器】BitMap与布隆过滤器

1.案例&#xff1a;40亿个QQ号&#xff0c;限制1G内存&#xff0c;如何去重&#xff1f; 40亿个unsigned int&#xff0c;如果直接用内存存储的话&#xff0c;需要&#xff1a; 4*4000000000 /1024/1024/1024 14.9G &#xff0c;考虑到其中有一些重复的话&#xff0c;那1G的…