我有一个正在运行以下代码的场景:
error_count=0
(cd tmp1 && terraform init -backend=false > /dev/null && terraform validate && echo "Terraform format check passed successfully in -------> xxx" && rm -rf .terraform*) || (echo "Terraform validation failed in xxx" && cd tmp && rm -rf .terraform* && let "error_count=error_count+1")
(cd tmp2 && terraform init -backend=false > /dev/null && terraform validate && echo "Terraform format check passed successfully in -------> yyy" && rm -rf .terraform*) || (echo "Terraform validation failed in yyy" && cd tmp && rm -rf .terraform* && let "error_count=error_count+1")
echo $error_count
if [ "$error_count" -gt 0 ]; then
echo "terraform check failed"
exit 1
else
echo "terraform check passed"
fi
我在这里观察到的是,即使条件失败,该error_count=0
值也保持不变。如何在失败情况下增加计数器?
答案1
作为罗埃马评论说,你的问题的核心可以归结为子shell环境(在(cd ... )
)完全退出,将抛在let "error_count=error_count+1"
身后,并且不影响父shell的error_count值。
我建议稍微重构一下代码,以便您拥有一个可重用的函数来执行常见功能并让它返回成功或失败代码:
#!/bin/bash
terraform_init_and_validate() (
if cd "$1" &&
terraform init -backend=false > /dev/null &&
terraform validate
then
echo "Terraform format check passed successfully in -------> xxx"
rm -rf .terraform*
return 0
else
echo "Terraform validation failed in xxx"
cd tmp && rm -rf .terraform*
return 1
fi
)
error_count=0
if ! terraform_init_and_validate tmp1
then
let "error_count=error_count+1"
fi
if ! terraform_init_and_validate tmp2
then
let "error_count=error_count+1"
fi
echo $error_count
if [ "$error_count" -gt 0 ]; then
echo "terraform check failed"
exit 1
else
echo "terraform check passed"
fi
terraform_init_and_validate 函数在子 shell 中运行代码,维护cd
命令的隔离,但根据两个 terraform 命令的成功或失败返回 true 或 false 值。然后,主脚本使用两个不同的参数调用该函数,并且仅当该函数返回错误代码时才递增 error_count。
我还要指出一个小差异(在我看来):代码的“成功”分支rm -rf .terraform*
从初始目录执行 a ,但“失败”分支执行 a cd tmp && rm -rf .terraform*
,这会从 a 中删除文件子目录的初始目录。