Until/do 루프는 예상대로 작동하지만 여러 구문 오류가 발생합니다.

Until/do 루프는 예상대로 작동하지만 여러 구문 오류가 발생합니다.

다음 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

마지막으로, 쉘 파일의 변수에 대문자를 사용하지 마십시오. 관례는 환경 변수에 대문자를 사용하는 것이므로 자신의 변수에 대문자를 사용하면 이름 충돌이 발생하고 오류를 추적하기 어려울 수 있습니다. 일반적으로 변수는 항상 소문자로 유지하는 것이 가장 좋습니다.

관련 정보