Bash

直到/do循環達到預期效果但拋出幾個語法錯誤

  • March 19, 2021

以下 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 ")

如何重新配置​​比較或以其他方式修改腳本以解決此問題?

當您設置變數的值時,您應該只使用變數的名稱,不要使用$:var=value而不是$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 文件中為變數使用大寫字母。慣例是對環境變數使用 CAPS,因此將它們用於您自己的變數可能會導致名稱衝突並且難以跟踪錯誤。始終使變數小寫通常是一種好習慣。

引用自:https://unix.stackexchange.com/questions/640120