实锤 Shell 脚本中使用 local 定义变量

博客讲述了在遵循Google Shell脚本规范时遇到的问题,特别是使用`local`和`grep`时,如何避免因`set -e`导致脚本意外退出。文章提供了三种解决方法,包括临时关闭`set -e`、使用`|| true`短路操作或直接合并声明与赋值。作者强调理解`grep`的退出码和正确运用规范的重要性。
摘要由CSDN通过智能技术生成

有一种病叫做代码编写规范强迫症,不知道规范都不知道怎么开始写代码,必须先看一遍代码编写规范!

背景

之前看过 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K8sCat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值