日期、算术和三元运算符在一行中

日期、算术和三元运算符在一行中

我有一个简单的代码来确保脚本在 Ubuntu 上至少需要 x 秒(此处为 500)

t1=$(date +%s)
# script is here
t2=$(date +%s)
let "t = 500 - $t2 + $t1"
(( t = t>0 ? t : 1 ))
sleep $t

代码工作完美,但我相信我的编码效率不高,这三行

t2=$(date +%s)
let "t = 500 - $t2 + $t1"
(( t = t>0 ? t : 1 ))

应该用一行来表达。我的问题是如何改进代码。

答案1

你的脚本是什么,是不可移植的(因为你正在使用letand (( .. ))),令人困惑(因为你正在使用两个都 let(( .. ))),缺乏文档(没有注释,变量名是非描述性的),并且有点不安全(因为您没有引用 的扩展$t)。

如果你想重写,这是我的:

#!/bin/sh

min_duration=500
t_start=$(date +%s)
# script is here
t_end=$(date +%s)
elapsed=$(( t_end - t_start ))

# sleep long enough to make sure 'min_duration' seconds has elapsed, 
# but at least 1 second
sleep "$(( elapsed < min_duration ? min_duration - elapsed : 1 ))"

答案2

这是我使用bash特殊参数的方法SECONDS

#!/bin/bash                                                                                                                                                                                  

SECONDS=0
# script is here                                                                                                                                                                             
sleep "$(( 500 > SECONDS ? 500 - SECONDS : 1 ))"

通常SECONDS返回自脚本启动以来的时间(以秒为单位),但可以分配任何值来(重新)设置计时器。

答案3

一个简单的替代方法是在后台运行 sleep,然后wait在运行其他代码后运行 sleep。

  #!/bin/bash

  sleep 500 &
  # script is here
  wait

相关内容