日付、算術演算、および三項演算子を1行に表示

日付、算術演算、および三項演算子を1行に表示

Ubuntuでは、スクリプトに最小x秒かかることを確認する簡単なコードがあります(ここでは500)。

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

コードは完全に動作しますが、私のコーディングは効率的ではないと思います。これらの3行は

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

1行で表現する必要があります。私の質問はコードを改善する方法です。

答え1

あなたのスクリプトは移植が不可能で(およびをlet使用しているので(( .. )))混乱しています(両方 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

簡単な代替方法は、バックグラウンドでスリープモードを実行し、wait別のコードを実行してからスリープモードを実行することです。

  #!/bin/bash

  sleep 500 &
  # script is here
  wait

関連情報