count 変数は増加しません。

count 変数は増加しません。

次のコードを実行するシナリオがあります。

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からファイルを削除します。サブディレクトリ初期ディレクトリ。

関連情報