+must() { "$@" || die "cannot $*"; } # runs args as command, reports args if command fails
+list_days_of_year_exp() {
+ # Desc: Lists days of year in expanded ISO-8601 ±Y̲Y̲YYYY-mm-dd format
+ # Usage: script.sh [str year]
+ # Input: arg1: year (≥4 digit gregorian calendar year)
+ # Output: stdout: iso-8601 dates (newline delimited)
+ # Depends: bash (5.1.16), GNU Coreutils (8.32; date, printf)
+ # Version: 0.0.1
+ # Ref/Attrib: [1] Linux Bash: How to print leading zeroes on a variable https://bytefreaks.net/gnulinux/bash/linux-bash-how-to-print-leading-zeroes-on-a-variable
+ # Ref/Attrib: ISO 8601:2004. 4.1.2.4. “Expanded Representations”
+
+ # Check arg
+ ## Validate argument count
+ if [[ $# -ne 1 ]]; then die "FATAL:Invalid number of arguments:$#"; fi;
+ year="$1";
+
+ ## Validate arg as an integer year
+ pattern='^[0-9]{4,}$'; # !!!! STOPPED WORK HERE 2023-04-11T18:34+00
+ if [[ ! $year =~ $pattern ]]; then die "FATAL:Not a 4-digit year:$year"; fi;
+ if [[ ! $year -gt 1582 ]]; then die "FATAL:Not a gregorian calendar year:$year"; fi;
+
+ yyyy=$year;
+ for (( month = 1; month <= 12; month++ )); do
+ mm="$(printf %02d "$month")"; # two-digit month; See [1]
+ #yell "DEBUG:mm:$mm";
+ for (( day = 1; day <= 31; day++ )); do
+ dd="$(printf %02d "$day")"; # two-digit day; See [1]
+ #yell "DEBUG:dd:$dd";
+ date_iso8601="$yyyy-$mm-$dd";
+ if date --date="$date_iso8601" 1>/dev/random 2>&1; then
+ printf "%s\n" "$date_iso8601";
+ fi;
+ done;
+ done;
+}; # iso-8601 dates (yyyy-mm-dd) to stdout