다음 코드를 실행하는 시나리오가 있습니다.
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에서 파일을 삭제합니다.하위 디렉토리초기 디렉토리.