fix(bkdstcountdown):Fix error when script run after last discont
authorSteven Baltakatei Sandoval <baltakatei@gmail.com>
Thu, 31 Dec 2020 21:13:00 +0000 (21:13 +0000)
committerSteven Baltakatei Sandoval <baltakatei@gmail.com>
Thu, 31 Dec 2020 21:13:00 +0000 (21:13 +0000)
Script was giving erroneous output if run during time period after a
year's last timezone discontinuity (e.g. PDT>PST in November in
America/Los_Angeles) and before the next year starts.

unitproc/bkdstcountdown

index ee3b094ee236594d575930beca807a4360ba59fd..4e3efe81182423551053a93fc0ac34f5d7281394 100755 (executable)
@@ -1,7 +1,5 @@
 #!/bin/bash
 
-# Date: 2020-02-13T23:14Z; baltakatei>
-
 # Description: This script outputs days until the next time zone
 # discontinuity using 'zdump' and 'date'.
 
@@ -9,25 +7,28 @@
 SCRIPT_TZ="America/Los_Angeles" # Timezone to check for discontinuities
 #=================================================
 
-echoerr() {
-    echo "$@" 1>&2;
-}
+yell() { echo "$0: $*" >&2; } # Yell, Die, Try Three-Fingered Claw technique; # Ref/Attrib: https://stackoverflow.com/a/25515370
+die() { yell "$*"; exit 111; }
+try() { "$@" || die "cannot $*"; }
 
 # Declare variables
 declare -a datesDiscontArray #array
 
 SCRIPT_YEAR=$(date +%Y)
 SCRIPT_YEAR_NEXT=$(( $(date +%Y) + 1))
+SCRIPT_YEAR_NEXT2=$(( $(date +%Y) + 2))
 SCRIPT_RUN_DATE_SECONDS=$(date +%s)
 
 # Save zdump output for SCRIPT_YEAR (for how multiline data saved in variable, see https://stackoverflow.com/a/613580 )
-datesDiscont="$(zdump -c $SCRIPT_YEAR_NEXT -v $SCRIPT_TZ | grep $SCRIPT_YEAR |  awk '{ print $2 " " $3 " " $4 " " $5 " " $6 " " $7 }'; echo)"
+datesDiscont="$(zdump -c "$SCRIPT_YEAR","$SCRIPT_YEAR_NEXT2" -v $SCRIPT_TZ | grep "$SCRIPT_YEAR\|$SCRIPT_YEAR_NEXT" |  awk '{ print $2 " " $3 " " $4 " " $5 " " $6 " " $7 }'; echo)"
 if [ -z "$datesDiscont" ]; then
-    echo "No time discontinuity this year."
-    exit 1
-fi
+    echo "No time discontinuity this year.";
+    exit 1;
+fi;
 
-###echoerr "datesDiscont:--""$datesDiscont""--"
+###yell "DEBUG:datesDiscont----------";
+###echo "$datesDiscont" 1>&2;
+###yell "DEBUG:-----------";
 
 # Count lines in datesDiscont (for counting lines in a variable, see https://stackoverflow.com/a/6314682 )
 #datesDiscontLineCount=$(echo "$datesDiscont" | wc -l)
@@ -39,21 +40,35 @@ while IFS= read -r line; do
     datesDiscontArray+=($(date --date="$line" +%s))
     #echo ${datesDiscontArray[-1]}
 done <<< "$datesDiscont"
-#echoerr ${datesDiscontArray[@]}
+#yell ${datesDiscontArray[@]}
 
 # Sort datesDiscontArray (see https://stackoverflow.com/a/11789688 )
 IFS=$'\n' datesDiscontArray=($(sort <<<"${datesDiscontArray[*]}"))
 unset IFS
 
+###yell "DEBUG:";
+###yell "DEBUG:datesDiscontArray:";
+###yell "${datesDiscontArray[@]}";
+###yell "DEBUG:";
+
 # Get earliest date in datesDiscontArray that isn't in the past.
 for discontinuityDate in "${datesDiscontArray[@]}"; do
-    ###echoerr "Discontinuity date (seconds):"$discontinuityDate
-    ###echoerr "SCRIPT_RUN_DATE_SECONDS     :"$SCRIPT_RUN_DATE_SECONDS
+    ###yell "DEBUG:Discontinuity date (seconds):"$discontinuityDate
+    ###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS     :"$SCRIPT_RUN_DATE_SECONDS
     if [ $discontinuityDate -gt $SCRIPT_RUN_DATE_SECONDS ]; then
-       ###echoerr "DEBUG:Date in future."
+       ###yell "DEBUG:Date in future."
        nextDiscontDate="$discontinuityDate"
        break
     fi
 done
 
+# Check that nextDiscontDate is not empty
+if [ -z "$nextDiscontDate" ]; then
+    echo "ERROR:nextDiscontDate empty"
+fi;
+   
+
+###yell "DEBUG:nextDiscontDate:$nextDiscontDate";
+###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS:$SCRIPT_RUN_DATE_SECONDS";
+
 echo $(( ( $nextDiscontDate - $SCRIPT_RUN_DATE_SECONDS )/86400 ))" days" # Days until next discontinuity date