linux – 执行shell脚本时条件表达式中的语法错误?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 执行shell脚本时条件表达式中的语法错误?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2501字,纯文字阅读大概需要4分钟。
内容图文
我正在开发一个项目,我需要从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脚本时条件表达式中的语法错误?全部内容,希望文章能够帮你解决linux – 执行shell脚本时条件表达式中的语法错误?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。