【问题标题】:How to do string comparison properly in shell script?如何在 shell 脚本中正确地进行字符串比较?
【发布时间】:2015-02-04 15:43:44
【问题描述】:

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

所以我上面的 if 条件不能以某种方式工作。因为我注意到如果我的state 变量值为IN_INIT,那么它是否也退出了shell 脚本?我在字符串比较中做错了什么吗?

【问题讨论】:

  • -eq 用于数字。对字符串使用=
  • @EtanReisner 感谢您的建议。是== 还是=
  • POSIX 说=。但是如果你想使用它,bash 接受==(虽然我不推荐它)。

标签: linux bash shell


【解决方案1】:

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

如果您使用[ 而不是[[,您将收到POST_INITIN_INIT 值的错误。

$ state=POST_INIT
$ [ $state -eq 0 ]
-bash: [: POST_INIT: integer expression expected
$ echo $?
2

我认为[[ 所做的实际上是更聪明更烦人。

我相信它正在扩展变量,然后在算术上下文中使用扩展值(其中变量甚至从裸词扩展)并且因为变量 POST_INIT 没有扩展为 @987654330 的值@ 默认情况下,您的检查通过。

$ 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" ]]; then exit 0; fi,它工作正常。你觉得使用这个有什么问题吗?
  • 我认为这看起来不错。对于单线,您可能会选择使用 [[ "$state" == "POST_INIT" || "$state" == "0" ]] &amp;&amp; exit 0 来减少混乱,但这是文体并且没有意义。
【解决方案2】:

试试这个

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

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

【讨论】:

  • 然而,当使用[[]] 时,您不需要引用变量。 if [[ $state == "POST_INIT" ... 将工作。它们被自动引用,它适用于多字和空字符串情况。
猜你喜欢
  • 1970-01-01
  • 2017-01-08
  • 2016-03-12
  • 1970-01-01
  • 2021-03-08
  • 2019-12-21
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多