实锤 Shell 脚本中使用 local 定义变量
有一种病叫做代码编写规范强迫症,不知道规范都不知道怎么开始写代码,必须先看一遍代码编写规范!背景之前看过 Google 的关于 Shell 脚本编写规范的内容,里面提到:使用 local 声明特定功能的变量。声明和赋值应该在不同行。当赋值的值由命令替换提供时,声明和赋值必须分开。因为内建的 local 不会从命令替换中传递退出码。踩坑遵循规范自打那之后,每当我使用 local 定义变量时,我都会这
·
有一种病叫做代码编写规范强迫症,不知道规范都不知道怎么开始写代码,必须先看一遍代码编写规范!
背景
之前看过 Google 的关于 Shell 脚本编写规范的内容,里面提到:
使用 local 声明特定功能的变量。声明和赋值应该在不同行。
当赋值的值由命令替换提供时,声明和赋值必须分开。因为内建的 local 不会从命令替换中传递退出码。
踩坑
遵循规范
自打那之后,每当我使用 local
定义变量时,我都会这样写:
local image_id
image_id=$(docker images | grep my_container)
出现问题
没问题,上面的写法确实规范。但是,当 shell 脚本中使用 set -e
时,如果 grep 没有匹配到内容的话,整个脚本就会在变量赋值的时候退出。
grep 没有匹配到内容时,退出码是 1。
$ grep -vE '^[.]' <<<$'.\n.'; echo $?
1
避坑
方式一
在 grep
前使用 set +e
,grep 结束之后再使用 set -e
:
local image_id
set +e
image_id=$(docker images | grep my_container)
set -e
方式二
local image_id
image_id=$(docker images | grep my_container) || true
方式三
有时候也是可以不遵循规范的啦~
local image_id=$(docker images | grep my_container)
总结
Google 的规范没有问题,归根结底,还是 grep
的使用不是很透彻!
原文链接:https://k8scat.com/posts/use-local-and-grep-in-shell-script/
更多推荐
已为社区贡献3条内容
所有评论(0)