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

How to do string comparison properly in shell script?

我正在通过 shell 脚本执行我的 url 并将响应存储在变量中。

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

点击上面的 url 之后,我将得到下面的响应,我需要解析它并从中提取 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

所以我上面的 if 条件不知何故不起作用。因为我注意到如果我的 state 变量值是 IN_INIT,那么它也会退出 shell 脚本?我这里的字符串比较有什么不对吗?

-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

尝试这个

 if [[ "$state" == "POST_INIT" || "$state" == "0" ]]; 

会有所帮助,因为如果您使用 [ $state == "POST_INIT" ] 之类的东西,它会忽略 $state 如果它是 null 并且宁愿将语句读取为 [ == "POST_INIT"。包括 " " ,防止这种情况。