gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:13:41 25 4
gpt4 key购买 nike

我正在通过 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 等于 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

关于linux - 如何在 shell 脚本中正确地进行字符串比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28311317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com