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和 not $var=value

在您的脚本中,有以下两行:

$counter=0
$max_loop_count=30

这些会给您带来语法错误,shell 不会将其识别为变量赋值,而是尝试将它们作为命令执行。您可以通过粘贴到终端来轻松验证这一点:

$ $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

最后,请避免在 shell 文件中使用大写字母作为变量。惯例是对环境变量使用大写字母,因此将它们用于您自己的变量可能会导致名称冲突并且难以跟踪错误。通常,最好将变量始终保持小写。

相关内容