Esse comportamento reconhecidamente surpreendente está documentado em man 5 crontab
(ênfase minha):
Os comandos são executados pelo cron (8) quando o minuto, hora e mês campos de ano correspondem à hora atual, e quando pelo menos um de os campos de dois dias (dia do mês ou dia da semana) correspondem aos tempo (veja '' Nota '' abaixo).
[...]
Nota: O dia da execução de um comando pode ser especificado por dois campos - dia do mês e dia da semana. Se ambos os campos forem restrito (isto é, não é *), o comando será executado quando um dos dois campo corresponde à hora atual . Por exemplo, '' 30 4 1,15 * 5 '' faria com que um comando fosse executado às 4:30 da manhã no dia 1 e no dia 15 de cada mês, mais toda sexta-feira.
Então, o que você precisa fazer é fazer com que seu comando teste o tempo. Assim como você faz para executá-lo apenas uma vez. Como isso está ficando complicado, eu recomendaria que a verificação fosse feita em seu próprio script e depois ativasse o comando cron todos os dias do mês relevante. Algo como
## Check if this is a weekday
[ $(date '+%u') -le 5 ] && [ $(date '+%u') -ge 1 ] || exit;
## Make sure it only runs once. If yesterday was also a weekday and
## date >=3 and <=5, we can assume the script ran then and should exit.
[ $(date -d yesterday '+%u') -le 5 ] && [ $(date -d yesterday '+%u') -ge 1 ] &&
[ $(date -d yesterday '+%d') -le 3 ] && [ $(date -d yesterday '+%d') -ge 5 ] && exit;
## Rest of your script goes here
[...]
Então, a partir de cron
, inicie seu script apenas nos dias 3 a 5 de cada mês:
7 0 3-5 * * /path/to/my/script.sh