Podemos aproveitar o fato de que o ponto de código UNICODE de numerais persas é consecutivos e ordenados de 0 a 9 :
$ printf '%b' '\U06F'{0..9}
۰۱۲۳۴۵۶۷۸۹
Isso significa que o último dígito hexadecimal é o valor decimal:
$ echo $(( $(printf '%d' "'۲") & 0xF ))
2
Isso torna esse loop simples uma ferramenta de conversão:
#!/bin/bash
( ### Use a locale that use UTF-8 to make the script more reliable.
### Maybe something like LC_ALL=fa_IR.UTF-8 for you?.
LC_ALL=en_US.UTF-8
a="$1"
while (( ${#a} > 0 )); do
# extract the last hex digit from the UNICODE code point
# of the first character in the string "$a":
printf '%d' $(( $(printf '%d' "'$a") & 15 ))
a=${a#?} ## Remove one character from $a
done
)
echo
Usando como:
$ sefr.sh ۰۱۲۳۴۵۶۷۸۹
0123456789
$ sefr.sh ۲۰۱
201
$ sefr.sh ۲۱
21
Observe que esse código também pode converter numerais em árabe e latino (mesmo se misturados):
$ sefr.sh ۴4٤۵5٥۶6٦۷7٧۸8٨۹9٩
444555666777888999
$ sefr.sh ٤٧0٠٦7١٣3٥۶٦۷
4700671335667