【问题标题】:How do I check for whether a condition is true as return value?如何检查条件是否为真作为返回值?
【发布时间】:2023-03-13 07:37:01
【问题描述】:

问题是等待文件更新,但不是无限期地更新。所以I want to check if a file has certain contents 为-

while ! grep -q $contents  /path/to/file
do
  sleep $timer
done

此外,我想检查计时器是否已过期,例如 $timer == 0。这里我们需要返回值中的响应,以便我可以使用 && 与另一个命令结合

! grep -q $contents /path/to/file && ls someFile 

然后返回代码被输入 if 并且不再需要临时变量。

我目前正在这样做,但我希望在 while 语句本身中这样做:

# Wait for 16, 8, 4, 2, 1 seconds each to check for progress
waitTime=16
while ! grep -q $contents $LOG_FILE
do
  sleep $waitTime
  waitTime=$((waitTime/2))
  if [ $waitTime -eq 0 ]
  then
    break
  fi
done

【问题讨论】:

  • 我是否正确地将您的问题解析为“如何在一定时间内轮询某个条件是否为真”?如果不是,您能否澄清我的解释与您要问的有何不同? (如果是这样,您介意我编辑您的问题以更清楚地反映预期的重点吗?)
  • 是的,你没看错。但我想看看这是否可以通过将测试结果作为返回值$? 返回的方式来完成,以便它位于 while 循环条件本身中。
  • 所有操作都有退出状态。 [ $waitTime -eq 0 ]——你已经在表演了——也有一个。

标签: linux bash return-value


【解决方案1】:

对于数学表达式,使用(( )) 在算术上下文中对其进行计算。

#!/usr/bin/env bash
#              ^^^^- not /bin/sh; (( )) -- vs $(( )) -- is a bashism.

waitTime=16
while (( waitTime )) && ! grep -q -e "$contents" /path/to/file; do
  sleep "$waitTime"
  waitTime=$(( waitTime / 2 ))
done

这里,(( waitTime )) 的退出状态为0,当且仅当waitTime 的值为正整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2017-09-17
    • 2013-04-19
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多