Bash
一行中的日期、算術和三元運算符
我有一個簡單的程式碼來確保腳本在 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
返回腳本啟動後的時間(以秒為單位),但可以分配任何值來(重新)設置計時器。
您的腳本是什麼,不可移植(因為您正在使用
let
and(( .. ))
),令人困惑(因為您同時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 ))"