help-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: SECONDS=0 does not reset SECONDS, or I'm missing something


From: Andreas Kusalananda Kähäri
Subject: Re: SECONDS=0 does not reset SECONDS, or I'm missing something
Date: Thu, 4 Jun 2020 15:00:40 +0200

On Thu, Jun 04, 2020 at 08:48:34AM -0400, Steve Amerige wrote:
> On 6/4/2020 6:14 AM, Andreas Kusalananda Kähäri wrote:
> >     #!/usr/local/bin/bash -x
> > 
> >     for name do
> >             SECONDS=0
> >             rm -r -f "$name"
> >             [[ SECONDS -gt 0 ]] && sleep "$SECONDS"
> >     done
> > 
> > What I noticed was that the script would go to sleep for a second
> > every second, even if the deletion of directories was quick.  This
> > indicates that SECONDS=0 didn't properly reset the SECONDS timer.
> 
> Note that your script doesn't have a semicolon after "for name":
> 
> for name; do
> ...
> done

That's because it doesn't need one.

>From the manual:

        for name [ [ in [ word ... ] ] ; ] do list ; done

That is, "for name in do list; done" is valid.

> 
> Note that you're not using parameter expansion for SECONDS.
> It should have been $SECONDS. You could have alternative used:
> 
> (( SECONDS > 0 ))
> 
> in which case the omission of the parameter expansion syntax is permitted.

The $ is not needed in arithmetic contexts, which is what [[ -gt ]] is.
See response to other person in this thread.

> 
> Also, as a side note, if your script were running with set -o errexit,
> the conditional idiom would fail because it doesn't handle the false case.
> Better:
> 
> if (( SECONDS > 0 )); then
>    sleep $SECONDS
> fi
> 

I don't understand this, or what it has to do with my issue.  Setting
errexit in the shell would not terminate the script due to a failure in
my AND-list (unless sleep somehow failed).

-- 
Andreas (Kusalananda) Kähäri
SciLifeLab, NBIS, ICM
Uppsala University, Sweden

.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]