Bash

一行中的日期、算術和三元運算符

  • February 4, 2019

我有一個簡單的程式碼來確保腳本在 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 ))

應該用一行來表示。我的問題是如何改程序式碼。

這是我使用bash特殊參數的方法SECONDS

#!/bin/bash                                                                                                                                                                                  

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

通常SECONDS返回腳本啟動後的時間(以秒為單位),但可以分配任何值來(重新)設置計時器。

您的腳本是什麼,不可移植(因為您正在使用letand (( .. ))),令人困惑(因為您同時 let使用and (( .. ))),缺乏文件(沒有註釋,並且變數名稱是非描述性的),並且勉強不安全(因為您沒有引用 的副檔名$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 ))"

引用自:https://unix.stackexchange.com/questions/498680