次のコードを実行するシナリオがあります。
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
〜のようにロエマ(cd ... )
コメントによれば、問題の核心は、サブシェル環境(in)が完全に終了し、それを残し、親シェルlet "error_count=error_count+1"
の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 関数はcd
コマンド分離を維持しながらサブシェルでコードを実行しますが、両方の terraform コマンドの成功または失敗に応じて true または false の値を返します。その後、デフォルトスクリプトは、2つの異なる引数を使用して関数を呼び出し、関数がエラーコードを返す場合にのみerror_countを増やします。
(私の考えでは)小さな違いも指摘したいです。コードの「成功」ブランチはrm -rf .terraform*
初期ディレクトリでaを実行しますが、「失敗」ブランチはaを実行してcd tmp && rm -rf .terraform*
aからファイルを削除します。サブディレクトリ初期ディレクトリ。