function pn_weekday { typeset ymd=$1 weekday=$2 pn=${3:-0} i x found=0 IN=0 [[ $ymd == +* ]] && IN=1 if (( pn < 0 )) then (( sign = -1 )) elif (( pn > 0 )) then (( sign = +1 )) else (( sign = 0 )) fi (( i = pn*sign*7 )) while (( i > 0 )); do (( IN == 0 )) && ymd=$(pn_day $ymd $sign) if [[ -z $x ]] then x=$(cur_weekday $ymd) else (( x = (x+1) % 7 )) fi (( x == weekday )) && { (( found = ymd )) } (( IN == 1 )) && ymd=$(pn_day $ymd $sign) (( i = i -1 )) done printf "%s\n" $found return 0 }