如何在 IF 语句中测试整数表达式(从命令中提取)

如何在 IF 语句中测试整数表达式(从命令中提取)

我在 bash 中创建了一个简单的脚本,用于在系统停机时间超过阈值时启动系统服务。如果部分基本上检查整数值(从命令中提取)临界点值(整数)

控制不会如果陈述。任何人都可以建议我上述解决方案。如何在 IF 语句中测试整数表达式。

#!/bin/bash
**function start_repair {                                                       
        threshold=120
        IP=10.194.51.216
        echo "$((systemctl status cassandra | awk'/(Active:failed)/{print$10}')| awk '{print ($0+0)}')"
        if [[ "$((systemctl status cassandra | awk '/(Active: failed)/{print $10}') | awk '{print ($0+0)}')" -gt "${threshold}" ]]; then
          echo "greater than ${threshold}"
          service cassandra restart
          PID=$!
          wait $PID
          echo done
    fi }**

错误: bash: 第 5 行: [: : 需要整数表达式

答案1

您的问题和您的职能存在一些问题。

首先,[: : integer expression expected错误不是由您的函数生成的。函数中的测试[[ ... -gt ... ]]不会生成此错误(在命令行上使用 进行测试[[ "hello" -gt "world" ]])。您在某处使用单括号进行了另一个测试,该测试会生成此错误(在命令行上使用 进行测试[ "hello" -gt "world" ])。[ ... ]在代码的其他地方寻找算术测试。

您可以在错误消息本身中看到这一点,因为它bash告诉您这是[产生错误的实用程序,并且它尝试进行算术测试的内容是一个空字符串。

您在评论中说过,在代码中更改print (0+$0)为使其可以工作。我怀疑这一变化是否会产生任何影响,因为这些陈述是等效的。更有可能的是,脚本的输入发生了更改,导致错误未被触发。print 0+$0awk

然后你评论说你在测试中更改-gt为。>这会将测试更改为字典顺序字符串排序测试。这样的测试将是真的如果左侧字符串排在右侧字符串之后,那么,例如,20 > 100将是真的

这也忽略了错误实际上并不在您所呈现的函数中的一点。

我的建议是编写脚本并在编写脚本时测试脚本的每个组件,以便您知道脚本中的每个添加都执行您希望它们执行的操作。


至于功能本身,它有很多问题。

例如,该PID变量可能应该保存cassandra进程的进程 ID,但由于您不cassandra作为后台作业启动(&在命令末尾使用),PID因此不会是您认为应该的样子,并且后续的进程wait $PID不会等待您认为正在等待的进程。

目前尚不清楚您希望通过PID变量和wait调用实现什么目的。我的猜测是,您可以删除对 的分配PID和对 的调用wait

最好$(( ... ) | ... )写成$( ... | ... ).首先,systemctl | awk在子 shell 中运行是不必要的,其次,阅读起来很混乱,$(( ... ))因为算术评估。

代码

awk'/(Active:failed)/ {print $10}' | awk '{print ($0+0)}'

可以合并成

awk'/(Active:failed)/ { print 0+$10 }'

相关内容