我正在通过shell脚本执行我的url并将响应存储在变量中。
http://hostname.domain.com:8080/beat
点击上面的网址后,我会得到以下回复,我需要解析它并从中提取state
的值
num_retries_allowed: 3 count: 30 count_behind: 100 state: POST_INIT num_rounds: 60 hour_col: 2 day_col: 0
现在我使用grep。
从上面的字符串中提取状态变量的值#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)
#grep $DATA for state
state=$(grep -oP 'state: \K\S+' <<< "$DATA")
[[ -z "$state" ]] && state=0
echo $state
此外,如果$DATA
变量state:
字符串不存在,那么我想将0
分配给state
变量。之后,我想验证条件并退出脚本,具体取决于那个。
如果state
等于POST_INIT
,则成功退出shell脚本或state
等于0
,然后也成功退出。
if [[ $state -eq "POST_INIT" || $state -eq "0" ]]; then exit 0; fi
所以我的上述条件不能以某种方式起作用。因为我注意到我的state
变量值是IN_INIT
,那么它是否也退出了shell脚本?我在字符串比较中有什么不对吗?
答案 0 :(得分:2)
-eq
用于比较数字。 =
用于比较字符串。
如果您使用的是[
而不是[[
,则会收到POST_INIT
和IN_INIT
值的错误。
$ state=POST_INIT
$ [ $state -eq 0 ]
-bash: [: POST_INIT: integer expression expected
$ echo $?
2
我相信[[
正在做的事实上更聪明,更烦人。
我相信它正在扩展变量,然后在算术上下文中使用扩展值(其中变量甚至从裸字扩展),因为变量POST_INIT
没有得到的值默认情况下展开为0
并且您的支票通过。
$ state=POST_INIT
$ [[ $state -eq 0 ]]; echo $?
0
$ POST_INIT=5
$ [[ $state -eq 0 ]]; echo $?
1
$ POST_INIT=0
$ [[ $state -eq 0 ]]; echo $?
0
答案 1 :(得分:0)
尝试这个
if [[ "$state" == "POST_INIT" || "$state" == "0" ]];
会有所帮助,因为如果您使用[$ state ==&#34; POST_INIT&#34; ],如果它为null,则忽略$ state,而宁愿将该语句读作[==&#34; POST_INIT&#34;。包括&#34; &#34; ,防止这种情况。