This Bash program parses day, month, year and month and year from arguments:
#!/usr/bin/env bash
for arg
do
day= month= year=
case $arg in
*/*/*|*-*-*)
read -r year month day <<< "$(date '+%Y %m %d' -d "$arg")"
;;
????/??|????/?)
IFS='/' read -r -a arr <<< "$arg"
month=${arr[1]} year=${arr[0]}
;;
????-??|????-?)
IFS='-' read -r -a arr <<< "$arg"
month=${arr[1]} year=${arr[0]}
;;
??/????|?/????)
IFS='/' read -r -a arr <<< "$arg"
month=${arr[0]} year=${arr[1]}
;;
??-????|?-????)
IFS='-' read -r -a arr <<< "$arg"
month=${arr[0]} year=${arr[1]}
;;
esac
echo "year: $year / month: $month / day: $day"
done
Usage:
./parse.sh 2021-03 2021-03-14 3/14/19 11/2019 2020/12
year: 2021 / month: 03 / day:
year: 2021 / month: 03 / day: 14
year: 2019 / month: 03 / day: 14
year: 2019 / month: 11 / day:
year: 2020 / month: 12 / day:
It seems overly-verbose to me. Can I write it more succinctly?