Проблемы с for

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-05-30 17:06:12

Добрый день.
Пишу скрипт, который мог бы перечитывать dhcp.conf и набивать статическими арпами таблицу.
Может конечно и ламерский вопрос, но что-то у меня не выходит с конструкцие for. Вот примерно так:

Код: Выделить всё

for s in `cat /etc/dhcpd.conf | grep host | grep -v "\#" | awk '{print \$2, \$6}'`
  do
  echo IP = $s
  done
на выходе получаю такое:
IP = host0
IP = 00:0d:93:9d:5c:13;
IP = host1
IP = 00:02:44:aa:c6:0f;
IP = host2
IP = 00:18:f8:ad:98:5d;
На входе в for должны быть строки вида "ip mac", а получается 2 строки с ip и mac.
т.е. for читает вход как массив, или я что-то не понимаю?
Заранее спасибо!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Проблемы с for

Непрочитанное сообщение Alex Keda » 2008-05-30 17:39:39

по пробелам делит
Убей их всех! Бог потом рассортирует...

NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Re: Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-05-30 18:01:44

Спасибо! Тогда логично предположить, что стоит их заменить на табуляцию, например, sed'ом, только как - непонятно... Символ табуляции я не знаю где найти. Или может быть поправить разделитель в первом awk'е ?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Проблемы с for

Непрочитанное сообщение Alex Keda » 2008-05-30 20:46:00

поделит по табам.
пустой символ - и всё. по нему и делит
Убей их всех! Бог потом рассортирует...

NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Re: Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-05-30 21:25:52

Сделал по-индийски, но все таки сделал. Может кому-то еще мой опыт будет полезен. Вот:

Код: Выделить всё

#!/bin/sh
arp -ad
for s in `cat /etc/dhcpd.conf | grep host | grep -v "\#" | awk '{printf "%s_%s\n", \$2, \$6}' | sed 's/;//g'`
  do
  ip=`echo $s | sed 's/_/ /g' | awk '{print $1}'`
  mac=`echo $s | sed 's/_/ /g' | awk '{print $2}'`
  arp -s $ip $mac 
  done

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Проблемы с for

Непрочитанное сообщение zg » 2008-05-31 7:29:25

у меня есть подозрение, что можно обойтись только awk, можешь выложить пример того, что у тебя в /etc/dhcpd.conf лежит

NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Re: Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-06-01 12:53:47

Там лежат такие конструкции, просто описываются статические привязки для dhcp:

Код: Выделить всё

host wifi1 { hardware ethernet 00:18:f8:ad:98:5d; fixed-address wifi1.host.ru; }
#host wifi2 { hardware ethernet 00:18:f8:ad:98:6c; fixed-address wifi2.host.ru; }
host wifi3 { hardware ethernet 00:18:f8:ad:9b:5e; fixed-address wifi3.host.ru; }
host wifi4 { hardware ethernet 00:13:46:98:17:df; fixed-address wifi4.host.ru; }

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Проблемы с for

Непрочитанное сообщение zg » 2008-06-01 13:19:03

Код: Выделить всё

game# cat 1.sh
#!/bin/sh

awk '{if(match($0,"^[^#]"))print $1, substr($6,1,17)}' 1.txt | {
  while read ip mac
  do
    echo -e "IP=$ip\tMAC=$mac"
  done
}

game# ./1.sh
IP=host MAC=00:18:f8:ad:98:5d
IP=host MAC=00:18:f8:ad:9b:5e
IP=host MAC=00:13:46:98:17:df
game# cat 1.txt
host wifi1 { hardware ethernet 00:18:f8:ad:98:5d; fixed-address wifi1.host.ru; }
#host wifi2 { hardware ethernet 00:18:f8:ad:98:6c; fixed-address wifi2.host.ru; }
host wifi3 { hardware ethernet 00:18:f8:ad:9b:5e; fixed-address wifi3.host.ru; }
host wifi4 { hardware ethernet 00:13:46:98:17:df; fixed-address wifi4.host.ru; }
я только не понял, в каком поле у тебя ипы лежат.. ну если чё то править надо $1

NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Re: Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-06-01 13:34:23

Спасибо огромное! Ипы берутся из named, т.е. это по сути wifi1.host.ru, wifi2.host.ru и т.д.

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Проблемы с for

Непрочитанное сообщение krilya » 2008-06-08 17:22:55

подскажите плиз как на shell сделать такой цикл?

Код: Выделить всё

for i=1 to 10
next i

NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Re: Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-06-08 17:32:19

Код: Выделить всё

for i in `seq2 -s 1 -e 10`
  do
  ...
  done
только seq2 потребуется дополнительно установить из портов.

Аватара пользователя
krilya
мл. сержант
Сообщения: 106
Зарегистрирован: 2008-03-11 4:42:29
Откуда: Комсомольск-на-Амуре

Re: Проблемы с for

Непрочитанное сообщение krilya » 2008-06-08 17:43:35

спасибо, а для чего нужна тулза из портов? неужели штатными средствами нельзя сделать?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Проблемы с for

Непрочитанное сообщение zg » 2008-06-08 19:28:27

krilya писал(а):а для чего нужна тулза из портов?
а чтоб значения ручками не вводить, но у неё вроде есть какой-то аналог, который последовательности генерит, уже не помню.. надо искать
krilya писал(а): неужели штатными средствами нельзя сделать?
смотря что конкретно тебе надо? если цикл, то тут лучше использовать while, если конкретно for тогда лучше почитать учебники на тему циклов.

NeonSunlight
рядовой
Сообщения: 10
Зарегистрирован: 2008-05-30 16:39:31

Re: Проблемы с for

Непрочитанное сообщение NeonSunlight » 2008-06-09 2:50:37

krilya писал(а):спасибо, а для чего нужна тулза из портов? неужели штатными средствами нельзя сделать?
Как вариант - сделать через while и инкрементить счётчик в теле цикла.