Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次符合Google Coding Style的Bash脚本重构

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

原创
作者头像
CloudPods
发布于 2023-05-25 08:37:43
发布于 2023-05-25 08:37:43
5130
举报
文章被收录于专栏:阅读栏目阅读栏目

最近我在思考这样一个问题,顺便看一下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.

我动手验证这个细节,发现果然如此:

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

代码语言:txt
AI代码解释
复制
local my_var="$(my_func)"

优化后的预期结果:

代码语言:txt
AI代码解释
复制
local my_var
my_var="$(my_func)"

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

代码语言:txt
AI代码解释
复制
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" # 模拟带引号的变量声明

测似乎生成的代码

代码语言:txt
AI代码解释
复制
$1local $2\n$1$2=$3

生成的代码

代码语言:txt
AI代码解释
复制
$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:

代码语言:txt
AI代码解释
复制
perl -pe 's/^(\s*)local\s+(\w+)=("?\$\(.*)/$1local $2\n$1$2=$3/g' -i file.txt

测试的场景:

搜索代码

代码语言:txt
AI代码解释
复制
pcregrep -lr '^(\s*)local\s+(\w+)=("?\$\(.*)' *

批量修正:

代码语言:txt
AI代码解释
复制
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,即保存时自动格式化,来自动处理格式问题。

代码语言:txt
AI代码解释
复制
# 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

总结:

links

以上是文章的主要内容

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux中高效编写Bash脚本的10个技巧
Linux开源社区(微信号:cn_linux) 英文:Aaron Kili,翻译:Linux中国/ch-cn 链接:linux.cn/article-8618-1.html Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括: 1、 脚本中多写注释 这是不仅可应用于 shell 脚本程序中,也可用在
顶级程序员
2018/05/03
1.7K0
Linux中高效编写Bash脚本的10个技巧
Google Shell 风格规范
可执行文件必须以 #!/bin/bash 开头和最少数量的标志。 使用 set 设置 shell 选项,以便将脚本调用为 bash 脚本名称不会破坏其功能。
acc8226
2022/05/17
1.3K0
Bash脚本编程(原创)
Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而编写。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能运行于大多数类Unix系统的操作系统之上,包括Linux與Mac OS X v10.4都將它作為預設shell。它也被移植到Microsoft Windows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP專案。在Novell NetWare與Andriod在上也有移植。1990年後,Chet Ramey成为了主要的维护者。為Bourne shell的後繼相容版本與開放原始碼版本,它的名稱來自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。
用户2645267
2018/08/04
1.5K0
Shell Style Guide
基础 脚本结构 脚本的基本结构应该遵循以下格式: #!SHEBANG CONFIGURATION_VARIABLES FUNCTION_DEFINITIONS MAIN_CODE shebang 文件中标明解释器的命令叫shebang,该字串以#!开头,并放于文件的第一行开头,操作系统的加载程序在执行时可以使用这一行来加载此文件的解释器,使其成为一个自可执行的脚本。 使用 Bash 作为唯一的shell脚本shebang! 正例: #!/bin/bash echo 反例: #!/bin/sh
PedroQin
2020/09/11
7.6K0
【SRE该掌握的利器】提升Shell脚本质量的利器:ShellCheck
ShellCheck是一个开源的静态分析工具,专门用于分析Shell脚本。它能够自动检测出脚本中的多种问题,包括但不限于语法错误、逻辑漏洞、代码风格问题,以及可能的安全风险。ShellCheck不仅能够识别问题,还能提供改进建议,帮助SRE快速定位并修复这些问题。
五分钟学SRE
2024/04/26
4870
Android代码规范利器: Checkstyle
Step1: 在 gradle文件夹下创建一个 checkstyle.gradle文件:
用户1205080
2018/12/26
1.1K0
如何规范开发一个vue项目
在软件开发的浩渺星海中,编程规范如同航海的罗盘,为我们指引方向,确保我们的代码之旅能够顺利、高效地到达目的地。无论是个人开发者还是大型团队,编程规范都是提升代码质量、保障项目成功不可或缺的一环。
炑焽
2024/09/07
2750
一文掌握shell脚本的基本语法
欢迎大家star我的GitHub:https://github.com/SolerHo/geeks-shell,建议直接使用GitHub来查看排版,发现markdown有错位的情况。
阳光罗诺
2022/01/03
4.2K0
一文掌握shell脚本的基本语法
实用的 bash 自定义脚本,快速提效工作流程
作者:掘金@苏里 https://juejin.im/post/6844904185599623175
ConardLi
2020/10/30
6470
实用的 bash 自定义脚本,快速提效工作流程
带你入门前端工程(二):统一规范
代码规范是指程序员在编码时要遵守的规则,规范的目的就是为了让程序员编写易于阅读、可维护的代码。
谭光志
2021/01/29
7630
Nuxt3 实战 (二):配置 Eslint、Prettierrc、Husky等项目提交规范
1、 Nuxt3 中是使用 @nuxt/eslint-config 进行代码检查和格式化,执行安装命令:
白雾茫茫丶
2024/05/22
6630
Nuxt3 实战 (二):配置 Eslint、Prettierrc、Husky等项目提交规范
【优化】记一次通过工具减少 Git 冲突
当我们的项目越来越大的时候,Git 冲突是团队协作中令人非常苦恼的事情,不仅仅浪费了我们时间,而且很容易解决冲突的时候出现问题。
GopalFeng
2020/11/25
1K0
【优化】记一次通过工具减少 Git 冲突
代码守护者:用git pre-commit-hook提升开发品质
在日常开发中,我们总是希望代码质量尽可能高,问题尽可能少。为了实现这一目标,git pre-commit-hook成为了我们的得力助手。通过在git commit操作前执行一系列检查,我们可以确保只有符合标准的代码才能被提交和推送到代码库。这种做法不仅有助于及时发现并解决问题,还能减少后续的code review工作量。
panzhixiang
2024/10/30
2430
Linux Bash脚本15分钟进阶教程
作者:Linux学习 ID:LoveLinux1024 这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。 脚本安全 我的所有bash脚本都以下面几句为开场白: #!/bin/bash set -o nounset set -o errexit 这样做会避免两种常见的问题: 引用未定义的变量(缺省值为“”) 执行失败的命令被忽略 需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”
小小科
2018/05/04
1.5K0
Linux Bash脚本15分钟进阶教程
Linux Bash脚本15分钟进阶教程
这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。
小小科
2018/07/31
1.2K0
Bash 编程易错总结大全
Bash Pitfalls[1] 文章介绍了 40 多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。每条作者在给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。文中有不少引用的文章,也值得大家仔细阅读。仔细阅读了这篇文章后,收获很多,不感独享,把这篇文章以半翻译半笔记的形式分享给大家。
码农架构
2022/11/17
2.9K0
Bash 编程易错总结大全
分享给您一个快速离职的 SHELL 脚本
哪位同学清理磁盘空间了,因为实在太干净了,只剩下几个必要的目录其它的文件全被删除了。「安全原因这里就不放图了」
运维部落
2020/08/10
6180
【二】项目规范和项目管理
在这一章我们进行一个简单的项目规范和项目管理,为了更好的代码协同,我们选择使用 Git 对代码进行管理并通过一系列 npm 包配置相应的规范约束。
思索
2024/09/24
1510
【二】项目规范和项目管理
SHELL(bash)脚本编程二:语法
token 是指被shell看成一个单一单元的字符序列 bash中包含三种基本的token:保留关键字,操作符,单词。 保留关键字是指在shell中有明确含义的词语,通常用来表达程序控制结构。包括:
用户5030870
2019/04/11
1.4K0
从零搭建 Vite + React 开发环境
大概在 2019 年,自己搭建 React 开发环境的想法萌芽,到目前为止,公司的很多项目上,也在使用中,比较稳定。为什么要自己造轮子?起初是因为自己并不满意市面上的脚手架。另外,造轮子对于自己也有一些技术上的帮助,学别人二次封装的东西,不如直接使用底层的库,这样也有助于自己系统的学习一遍知识,最近 Vite 很火,所以用 Vite 搭建一波,废话不多说,直接进入正文,如何搭建自己的开发环境。
发声的沉默者
2021/06/14
4.5K0
从零搭建 Vite + React 开发环境
相关推荐
Linux中高效编写Bash脚本的10个技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档