Решено: итерация в bash

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

Решено: итерация в bash

Сообщение frost666dark »

И так, вот рабочий пример итерации с двумя циклами:

(Special thank's Subj_rs)

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

#!/bin/bash

i=0
j=0
for a in hello hi hola re; do
    let i=i+1
for b in hello hi hola re; do
    let j=j+1
if [ $i -eq $j ]; then
    echo "$a $b"
fi
done
j=0
done


Вот его вывод:

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

hello hello
hi hi
hola hola
re re


Как сделать то же самое но стремя циклами (именно с тремя!), без всяких дублирований и эмуляций, потому что те слова что сейчас в примерах
могут принять любые значения... в моем случае это значения для правил iptables (1 цикл: ip , 2 цикл: порт , 3 цикл: connlimit), это чтобы не
возникало вопросов зачем это вообще нужно

Спасибо!
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: Решено: итерация в bash

Сообщение KiWi »

Давайте -- исходные данные и ожидаемый выход. Сейчас это не больше чем набор букв.
Спасибо сказали:
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

Re: Решено: итерация в bash

Сообщение frost666dark »

KiWi писал(а):
31.12.2007 12:57
Давайте -- исходные данные и ожидаемый выход. Сейчас это не больше чем набор букв.

ok.

есть файл 'allow_ip'

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

221.222.223.224 25 10
121.122.123.124 110 5
111.123.134.145 143 6


В скрипте эти данные приобретут такой вид:

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

#!/bin/bash
IPT=/sbi/iptables
IP=`cat ./allow_ip | awk '{print $1}'`
PORT=`cat ./allow_ip | awk '{print $2}'`
LIMIT=`cat ./allow_ip | awk '{print $3}'`


i=0
j=0
for a in $IP; do
    let i=i+1
for b in $PORT; do
    let j=j+1
if [ $i -eq $j ]; then
    $IPT -A LIMIT -p tcp --syn -s $a --dport $b -m connlimit --connlimit-above $c(тут LIMIT!) -j DROP
fi
done
j=0
done


Это выборка из полей $1 и $2, ($IP и $PORT соответственно), как к этому делу приплюсовать еще одну функцию, которая бы осуществляла подстановку из поля $3 ($LIMIT), то есть нужен еще некто $c

Извеняюсь, строчку с правилом iptables я привел с ожидаемым видом, не имея представления как реализовать цикл для $c

Так понятно?
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:

Re: Решено: итерация в bash

Сообщение sash-kan »

зачем так сложно? можно ведь гораздо проще

$ cat /tmp/0 221.222.223.224 25 10 121.122.123.124 110 5 111.123.134.145 143 6 $ cat /tmp/0 | while read i j k; do echo "ip=$i port=$j limit=$k"; done ip=221.222.223.224 port=25 limit=10 ip=121.122.123.124 port=110 limit=5 ip=111.123.134.145 port=143 limit=6
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Решено: итерация в bash

Сообщение diesel »

хм. если задача в таком виде ... то почему awk не использовать?

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

diesel@beezir:~$ awk '{print "iptables -A LIMIT -p tcp --syn -s",$1,"--dport",$2,"-m connlimit --connlimit-above",$3,"-j DRPOP"}' test
iptables -A LIMIT -p tcp --syn -s 221.222.223.224 --dport 25 -m connlimit --connlimit-above 10 -j DRPOP
iptables -A LIMIT -p tcp --syn -s 121.122.123.124 --dport 110 -m connlimit --connlimit-above 5 -j DRPOP
iptables -A LIMIT -p tcp --syn -s 111.123.134.145 --dport 143 -m connlimit --connlimit-above 6 -j DRPOP

diesel@beezir:~$ cat test
221.222.223.224 25 10
121.122.123.124 110 5
111.123.134.145 143 6
Спасибо сказали:
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

Re: Решено: итерация в bash

Сообщение frost666dark »

ну, это все хорошо :) Сижу радуюсь :) Ток позвольте еще один вопрос (совсем тупой), вот получил я по вашим примерам нужные правила в stdout, а дальше то чего мне с ними делать? =) Это ж текст обычный
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Решено: итерация в bash

Сообщение diesel »

frost666dark писал(а):
31.12.2007 14:24
ну, это все хорошо :) Сижу радуюсь :) Ток позвольте еще один вопрос (совсем тупой), вот получил я по вашим примерам нужные правила в stdout, а дальше то чего мне с ними делать? =) Это ж текст обычный

можно пайпать результат в шелл:

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

awk '{print "iptables -A LIMIT -p tcp --syn -s",$1,"--dport",$2,"-m connlimit --connlimit-above",$3,"-j DRPOP"}' test | sh


а в примере sash-kan'а можно еще просто убрать echo с кавычками.
Спасибо сказали:
Аватара пользователя
frost666dark
Сообщения: 346
ОС: archlinux

Re: Решено: итерация в bash

Сообщение frost666dark »

А.... Все, извеняюсь :) Это уж совсем глупый вопрос был, тем более в примере sash-kan мог бы уж и сам догадаться :) Ну ладно.
Всем спасибо!
PS: Слакварщики приглашаются slackware@conference.jabber.ru
Спасибо сказали:
Аватара пользователя
guglez
Сообщения: 394
ОС: GNU/Linux

Re: Решено: итерация в bash

Сообщение guglez »

Как заставить игнорировать коментарии в обоих случаях?
файл тест такой:


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

#ivanov
221.222.223.224 25 10
#petrov
121.122.123.124 110 5
#sidorov
111.123.134.145 143 6


Сам решил :) Надо через sed '/^\#/d' test пропустить
Спасибо сказали:
Ответить