我有一个简单的代码来确保脚本在 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
你的脚本是什么,是不可移植的(因为你正在使用let
and (( .. ))
),令人困惑(因为你正在使用两个都 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