如何在shell脚本中正确进行字符串比较?

时间:2015-02-04 00:19:49

标签: linux bash shell

我正在通过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脚本?我在字符串比较中有什么不对吗?

2 个答案:

答案 0 :(得分:2)

-eq用于比较数字。 =用于比较字符串。

如果您使用的是[而不是[[,则会收到POST_INITIN_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; ,防止这种情况。