如何在 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_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
尝试这个
if [[ "$state" == "POST_INIT" || "$state" == "0" ]];
会有所帮助,因为如果您使用 [ $state == "POST_INIT" ] 之类的东西,它会忽略 $state 如果它是 null 并且宁愿将语句读取为 [ == "POST_INIT"。包括 " " ,防止这种情况。
我正在通过 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_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
尝试这个
if [[ "$state" == "POST_INIT" || "$state" == "0" ]];
会有所帮助,因为如果您使用 [ $state == "POST_INIT" ] 之类的东西,它会忽略 $state 如果它是 null 并且宁愿将语句读取为 [ == "POST_INIT"。包括 " " ,防止这种情况。