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 값을 반환합니다. 그런 다음 기본 스크립트는 두 개의 서로 다른 인수를 사용하여 함수를 호출하고 함수가 오류 코드를 반환하는 경우에만 error_count를 증가시킵니다.

(제 생각에는) 작은 차이점도 지적하고 싶습니다. 코드의 "성공" 분기는 rm -rf .terraform*초기 디렉터리에서 a 를 실행하지만 "실패" 분기는 a 를 실행하여 cd tmp && rm -rf .terraform*a에서 파일을 삭제합니다.하위 디렉토리초기 디렉토리.

관련 정보