最近我在思考这样一个问题,顺便看一下gpt对这个问题的解释。搜索发现:
继续搜索:
这些规范有助于提高 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 -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,检验效果,发现符合预期。
为了让以后新增的代码,也都符合上述规范,我增加了这样一个 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
以上是文章的主要内容,作为融合云/多云管理/私有云/FinOps 厂商,云联壹云会持续关注这些领域的动态,分享相关的信息和技术,可以通过的官网(yunion.cn)或关注的公众号(云联壹云)来获取最新的信息,感谢大家的时间。
原文地址:https://www.yunion.cn/article/html/20230524.html
云联壹云融合云管理平台的 10 大应用场景
SkyPilot:构建在多云之上的ML和数据科学,可节约3倍以上成本
Flexera 2023 云状态报告解读
新品发布 | Cloudpods 3.10版本上线!
企业面对FinOps,到底能做些什么?总结了4个方面