我在 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+$0
awk
然后你评论说你在测试中更改-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 }'