Linux

執行shell腳本時條件表達式中的語法錯誤?

  • March 7, 2014

我正在開發一個項目,我需要從 bash shell 腳本對我的一台伺服器進行 url 呼叫。

http://hostname.domain.com:8080/beat

點擊上述網址後,我將得到以下響應,我需要對其進行解析並提取syncssyncs_behind

state: READY num_retries_allowed: 3 syncs: 30 syncs_behind: 100 num_rounds: 60 hour_col: 2 day_col: 0 oldest_day_col: 0

現在我需要每 10 秒點擊一次上述 url,持續 10 分鐘,並從中提取和從中提取值,syncssyncs_behind使用以下條件驗證它 -

syncs > 8
syncs_behind = 0

如果同步大於 8 並且 syncs_behind = 0,那麼我將結束我的 shell 腳本並顯示一些消息 - “數據已被驗證”,否則我將繼續嘗試 10 分鐘的視窗。如果在那個 10 分鐘的視窗中,這不會發生我無論如何都會結束 shell 腳本,這意味著我不會再試一次。

所以我從下面的程式碼開始,並將文件保存為beat.sh以下內容 -

#!/bin/bash

COUNT=60   #number of 10 second timeouts in 10 minutes
SUM_SYNCS=0
SUM_SYNCS_BEHIND=0

while [[ $COUNT -ge "0" ]]; do

#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)

#grep $DATA for syncs and syncs_behind
SYNCS=$(echo $DATA | grep -o 'syncs: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo $DATA | grep -o 'syncs_behind: [0-9]+' | awk '{print $2}')
echo $SYNCS
echo $SYNCS_BEHIND

#add new values to the sum totals
let SUM_SYNCS+=SYNCS
let SUM_SYNCS_BEHIND+=SYNCS_BEHIND

#verify conditionals
if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi

#decrement the counter
let COUNT-=1

#wait another 10 seconds
sleep 10

done

當我執行它時./beat.sh,我得到了以下錯誤 -

./beat.sh: line 23: syntax error in conditional expression
./beat.sh: line 23: syntax error near `-a'
./beat.sh: line 23: `if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi'

任何想法我在這裡做錯了什麼?

Bash[[不支持-a. 一種方法是使用[或保持相同:

[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]

但是,為了獲得最佳結果[,應該雙引號變數:

[ "$SYNCS" -gt 8 -a "$SYNCS_BEHIND" -eq 0 ]

但在一般情況下-a-o應該避免,因為當[命令接收到超過 4 (除了[and ])時,它不能可靠地解析它的參數。所以

[ "$SYNCS" -gt 8 ] && [ "$SYNCS_BEHIND" -eq 0 ]

或者,保留[[&&用於-a

[[ $SYNCS -gt "8" && $SYNCS_BEHIND -eq "0" ]]

許多人更喜歡[[[因為變數周圍的雙引號是不必要的。

但是在這裡,如果你要使用 ksh/bash/zsh 特定的語法,進行算術比較,你不妨這樣寫:

(( SYNCS > 8 && SYNCS_BEHIND == 0 ))

更多: 線條grep有兩個問題。正如豪克所指出的,其中一個冒號是多餘的。其次,要使用[0-9]+語法,這兩行都需要-E擴展正則表達式的選項:

SYNCS=$(echo "$DATA" | grep -oE 'syncs: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo "$DATA" | grep -oE 'syncs_behind: [0-9]+' | awk '{print $2}')

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