Обратный IP в сценарии оболочки

Я ищу более простой, более идиоматический и, что наиболее важно, совместимый со стандартами (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 обеспечивает множество опций и флагов для настройки поведения команд.


50
3

Ответы:

это должно быть одной из возможностей того, что вы ищете

#!/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"