Вот моя версия, в которой вы можете передать список интерфейсов, упорядоченный по приоритету:
getIpFromInterface()
{
interface=$1
ifconfig ${interface} > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}
getCurrentIpAddress(){
IFLIST=(${@:-${IFLIST[@]}})
for currentInterface in ${IFLIST[@]}
do
IP=$(getIpFromInterface $currentInterface)
[[ -z "$IP" ]] && continue
echo ${IP/*:}
return
done
}
IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@
Так что, если я подключен через VPN, Wifi и Ethernet, мой VPN-адрес (на интерфейсе tap0) будет возвращен. Скрипт работает как на linux, так и на osx и может принимать аргументы, если вы хотите переопределить IFLIST
Обратите внимание, что если вы хотите использовать IPV6, вам придется заменить «inet» на «inet6».