Для zsh необходимо установить параметры EXTENDED_GLOB
.
Чтобы узнать, были ли они установлены, запустите setopt
для отображения установленных параметров:
$ setopt | grep glob
extendedglob
Если он не установлен, запустите setopt extended_glob
.
ПРИМЕЧАНИЕ. :это приведет к тому, что ~
, ^
и #
не будут расширены.
Проблема в моем случае заключалась в том, что, хотя я установил эту опцию в оболочке, я запускал цикл for в сценарии. Сценарий запускает собственную оболочку для запуска, поэтому для него не установлен этот параметр.
Чтобы исправить эту конкретную проблему, поместите setopt extendedglob
в сам скрипт.
Почему нельзя использовать awk и sed?
Вот еще одно решение:
grep ^0.0.0.0 | tr -s " " | cut -f2 -d" "
Опция -s
превращает цепочки пробелов в один пробел.
Не уверен, что понимаю, но это?
# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 enp0s25
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 wlp3s0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s25
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlp3s0
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr1
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
# netstat -rn | while read dest gw rest ; do [[ "${dest}" == "0.0.0.0" ]] && echo "${gw}" ; done
192.168.1.1
192.168.1.1
Используя только netstat и оболочку, вы можете сделать
set -- $(netstat -rn)
shift 13
echo $1
но это немного хрупко.
x=$(netstat -rn | while read a b rest ; do [ a = "0.0.0.0" ] || continue ; echo $b ; break ; done )
более надежен, но явно длиннее.