Я ищу более простой, более идиоматический и, что наиболее важно, совместимый со стандартами (POSIX) способ реверсирования IP-адреса с использованием sh
оболочки Unix.
Вот мое текущее решение:
RevIP() {
echo "$1"|tr . "\n"|tac|tr "\n" .
# 'Split' on the dot character, reverse the list, 'join' with dot
}
Пример использования:
$ RevIP 23.45.67.89
89.67.45.23.
Проблемы:
tac
, которого нет в POSIX.
и новой строки нет. Не большая проблема, но в идеале она должна заканчиваться на \n
.|sed s/...
в конце, но есть ли способ сделать это более элегантно, чтобы в этом не было необходимости?🤔 А знаете ли вы, что...
Shell обеспечивает множество опций и флагов для настройки поведения команд.
это должно быть одной из возможностей того, что вы ищете
#!/bin/sh
ip = "$1"
reversed=$(echo "$ip" | awk -F '.' '{print $4 "." $3 "." $2 "." $1}')
echo "$reversed"
$ echo '23.45.67.89' |
> mawk '$!NF = sprintf((_ = "%s.%s") "." _,
> $(_ = NF), $--_, $--_, $--_)' FS='[.]'
89.67.45.23
Для этого не нужны внешние команды; встроенных оболочек достаточно.
reversed=$(echo "$ip" | { IFS=. read q1 q2 q3 q4; echo "$q4.$q3.$q2.$q1"; })
...или, немного более эффективно (но чуть менее лаконично):
IFS=. read q1 q2 q3 q4 <<EOF
$ip
EOF
reversed = "$q4.$q3.$q2.$q1"