私のスクリプトにはいくつかの問題がありますが、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
))
(また、以前の使用法と一貫性を維持するために、および間にスペースを追加しました。)