Divida as vírgulas / espaços primeiro, faça um loop nos resultados e divida em traços para começar e terminar o intervalo:
$ cat ranges.sh
#!/bin/bash
IFS=', ' read -a ranges <<< "$*"
for range in "${ranges[@]}"; do
IFS=- read start end <<< "$range"
[ -z "$start" ] && continue
[ -z "$end" ] && end=$start
for (( i=start ; i <= end ; i++ )); do
echo "$i"
done
done
$ bash ranges.sh 1-3,5 9-10
1
2
3
5
9
10
Isso poderia fazer com melhor verificação de sanidade, etc.