Bash 代码优化思考
最近我在思考这样一个问题,顺便看一下gpt对这个问题的解释。搜索发现:
团队写代码,为什么要遵循coding guideline?
继续搜索:
对于一个使用bash为主要语言的项目,业界推荐的coding guideline?
这些规范有助于提高 Bash 代码的可读性、可维护性和可靠性。
然后我搜索 "bash script style guideline",最上面的结果是:
即代码规范:https://google.github.io/styleguide/shellguide.html
我仔细阅读了这份风格指南,对其中的“局部变量”的章节很感兴趣。
文中说:「最好把局部变量的定义与赋值,换行实现,不要写到同一行上」,以免掩盖报错状态码。
我动手验证这个细节,发现果然如此:
然后我开始自查当前的项目,寻找类似于如下风格的代码:
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
总结:
links
以上是文章的主要内容,作为融合云/多云管理/私有云/FinOps 厂商,云联壹云会持续关注这些领域的动态,分享相关的信息和技术,可以通过的官网或关注的公众号(云联壹云)来获取最新的信息,感谢大家的时间。