bashスクリプト:固定のスリープ時間がwhileループに蓄積されます。

bashスクリプト:固定のスリープ時間がwhileループに蓄積されます。

私はbashスクリプトに初めて触れ、いくつかのサンプルスクリプトで始めます。

一つは:

#!/bin/bash
SECONDS=5
i=1

while true
do
        echo "`date`: Loop $i"
        i=$(( $i+1 ))
        sleep $SECONDS
done

その結果は次のとおりです。

Sunday 10 May  15:08:20 AEST 2020: Loop 1
Sunday 10 May  15:08:25 AEST 2020: Loop 2
Sunday 10 May  15:08:35 AEST 2020: Loop 3
Sunday 10 May  15:08:55 AEST 2020: Loop 4

...これは私が期待したりスクリプトで実行したいのではありません。

ループを通過するたびに秒数が2倍になるのはなぜですか?

bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

ベストアンサー1

SECONDSbashの内部変数だからです。シェルが実行された時間を保存します。

からman bash

SECONDS
このパラメータが参照されるたびにシェルが呼び出されてからの秒数が返されます。値がSECONDSに割り当てられている場合、後続の参照によって返される値は、割り当て後の秒数に割り当てられた値を加算した値です。

したがって、スクリプトは次のように動作します。

  1. 最初に使用される場合、値5は入力として受け入れられ、初期値は5です。
  2. その後、5秒の睡眠があり、睡眠が返されると、SECONDSの値は初期値の5秒+ 5秒の睡眠= 10秒になります。
  3. 次に、10秒(現在の値SECONDS)に前の10秒の累積時間である20を加えて睡眠をとります。
  4. 20秒間睡眠を繰り返し、前の値である20を40に追加します。
  5. など。

おすすめ記事