Мы можем воспользоваться тем фактом, что кодовая точка UNICODE персидских цифр последовательна и упорядочена от 0 до 9 :
$ printf '%b' '\U06F'{0..9}
۰۱۲۳۴۵۶۷۸۹
Это означает, что последняя шестнадцатеричная цифра ЯВЛЯЕТСЯ десятичным значением:
$ echo $(( $(printf '%d' "'۲") & 0xF ))
2
Это делает этот простой цикл инструментом преобразования:
#!/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
Использование его как:
$ sefr.sh ۰۱۲۳۴۵۶۷۸۹
0123456789
$ sefr.sh ۲۰۱
201
$ sefr.sh ۲۱
21
Обратите внимание, что этот код также может преобразовывать арабские и латинские числа (даже если они смешаны ):
$ sefr.sh ۴4٤۵5٥۶6٦۷7٧۸8٨۹9٩
444555666777888999
$ sefr.sh ٤٧0٠٦7١٣3٥۶٦۷
4700671335667