linux – 执行shell脚本时条件表达式中的语法错误?

我正在开发一个项目,我需要从bash shell脚本中调用我的一个服务器.

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

点击上面的url后,我将得到以下响应,我需要解析它并提取同步和syncs_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秒钟点击上面的网址,持续10分钟,并从中提取同步和syncs_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应该避免作为[命令cannot parse its arguments reliably when it receives more than 4 (beside [ and ]).所以

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

或者,保持[[但使用&&为一个:

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

许多人更喜欢[[over [因为围绕变量的双引号是不必要的.

但是在这里,如果您要使用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}')

转载注明原文:linux – 执行shell脚本时条件表达式中的语法错误? - 代码日志