睡眠を含むこの「while」ループのカウントダウンは機能しません。

睡眠を含むこの「while」ループのカウントダウンは機能しません。

私のスクリプトにはいくつかの問題がありますが、bash理由がわかりません。スクリプトは入力(分単位)を秒に変換してからゼロに達するまでカウントダウンを開始し、この時点でスクリプトが停止するように設計されています。

sleep 1途中で1つを追加すると、カウントダウンが停止します。なぜこれが起こるのですか?

パスワード:

if [ -z $1 ];
then
     read NUMBER
else NUMBER=$1
fi
SECONDS=$(( NUMBER * 60 ))

while [ $SECONDS -gt 0 ]
do
      sleep 1
      SECONDS=$(( SECONDS - 1))
      echo $SECONDS remaining
done

echo end

ベストアンサー1

SECONDSスクリプトの縮小操作を妨げるように動作するBashで内部的に使用される変数。別の変数名(たとえば、SECSまたは)を使用するとseconds正しく機能します。たとえば、

#!/usr/bin/env bash

if [ -z $1 ];
then
     read NUMBER
else NUMBER=$1
fi

SECS=$(( NUMBER * 60 ))

while [ $SECS -gt 0 ]
do
      sleep 1
      SECS=$(( SECS - 1 ))
      echo $SECS remaining
done

echo end

Bashのマニュアルページでは、変数を使用したときに表示される動作について説明しますSECONDS

SECONDS
       Each time this parameter is referenced, it expands to the number of sec-
       onds since shell invocation.  If a value is  assigned  to  SECONDS,  the
       value returned upon subsequent references is the number of seconds since
       the assignment plus the value assigned.  The number of seconds at  shell
       invocation  and  the  current time are always determined by querying the
       system clock.  If SECONDS is unset, it  loses  its  special  properties,
       even if it is subsequently reset.

への各参照はSECONDS最後の割り当てから1秒なので、返される値は2番目に割り当てられた最初の値を加えた値です(ループ前while)。したがって、実際にループを通過するたびに減少がキャンセルされます。

1))(また、以前の使用法と一貫性を維持するために、および間にスペースを追加しました。)

おすすめ記事