다음 bash 스크립트는 두 번째 bash 스크립트를 실행한 후 두 번째 스크립트의 효과를 관찰하기 위해 기다립니다 until / do
. 이 스크립트는 RHEL7 서버에서 실행됩니다.
FILE=/sentinel_failover.sh
if test -f "$FILE"; then
echo "$FILE exists."
OUTPUT=$("$FILE")
echo $OUTPUT
$counter=0
$max_loop_count=30
#Continue when no instances on this server are primary or the timeout has elapsed
until (( $counter == $max_loop_count || $primary_byte_count == 0 ))
do
primary_byte_count=$(grep /etc/redis/redis.* -e port -e auth \
| sed 's/.*\:port/redis-cli -p/' \
| sed -e 'N;s/\n/ /' \
| sed 's#\/etc\/redis\/redis.* "# -a #' \
| sed -e 's/"/ --no-auth-warning info \| grep role/' \
| sed -e 'N;s/ / /' \
| source /dev/stdin \
| grep master \
| wc -c)
sleep 1
((counter++))
done
if [[ $primary_byte_count -eq 0 ]]
then
exit 0
else
fail_step "Incomplete failover before reaching max loop count of 30 $max_loop_count"
fi
스크립트는 예상대로 작동합니다. 전략적 위치에서 카운터 값을 에코하여 이를 확인했지만 루프가 처음 실행될 때 다음 오류가 발생합니다.
/test_script.sh: line 8: =0: command not found
/test_script.sh: line 9: =30: command not found
/test_script.sh: line 11: ((: == 30 || == 0 : syntax error: operand expected (error token is "== 30 || == 0 ")
이 문제를 해결하려면 비교를 재구성하거나 스크립트를 수정하려면 어떻게 해야 합니까?
답변1
$
변수의 값을 설정할 때 : var=value
는 사용하지 않고 변수 이름만 사용해야 합니다 $var=value
.
스크립트에는 다음 두 줄이 있습니다.
$counter=0
$max_loop_count=30
이로 인해 구문 오류가 발생하고 쉘은 이를 변수 할당으로 인식하지 않고 대신 명령으로 실행하려고 시도합니다. 터미널에 붙여넣어 이를 쉽게 확인할 수 있습니다.
$ $counter=0
bash: =0: command not found
$ $max_loop_count=30
bash: =30: command not found
이 줄은 실제로 변수에 대한 값을 설정하지 않으므로 다음 구문 오류가 발생합니다.
/test_script.sh: line 11: ((: == 30 || == 0 : syntax error: operand expected (error token is "== 30 || == 0 ")
이는 이 줄을 실행할 때 다음과 같기 때문입니다.
until (( $counter == $max_loop_count || $primary_byte_count == 0 ))
모든 변수에는 값이 없으므로 테스트는 == 0
.
다음과 같이 변수 할당을 수정하여 세 가지 오류를 모두 수정할 수 있습니다.
counter=0
max_loop_count=30
마지막으로, 쉘 파일의 변수에 대문자를 사용하지 마십시오. 관례는 환경 변수에 대문자를 사용하는 것이므로 자신의 변수에 대문자를 사용하면 이름 충돌이 발생하고 오류를 추적하기 어려울 수 있습니다. 일반적으로 변수는 항상 소문자로 유지하는 것이 가장 좋습니다.