Страница 1 из 1

[for] несколько переменных в цикле

Добавлено: 2012-01-31 17:47:59
MASiK
Собственно сабж как бы так сделать что бы было несколько переменных в цикле?

стандартный цикл

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

#!/bin/sh
b=`seq 10`

for i in $b;do
echo $i 123
done
Ну и мы увидим в ряд
1 123
2 123
3 123
4 123
.....
9 123
10 123
А вот мне бы сделать так что бы переменных было больше чем 1 i надо что бы вышло примерно так

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

#!/bin/sh
b=`seq 10`
с=`test1 test2 test3 test4 test5 ... test9 test10`

for i b in $b $c;do
echo $i $b 123
done
Вот ка-то так

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 17:59:25
kpp
Так нельзя.
Предлагаю так:

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

#!/bin/sh
b=`seq 10`
c=`test1 test2 test3 test4 test5 ... test9 test10`

for i in $b
do
   echo "$c" | awk '{print a" "$a" "aa}' a=$i, aa=123
done

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 18:49:05
MASiK
Не так всё просто, постараюсь объяснить поподробнее чего хочу сделать

есть файлик, его используем как шаблон

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

 cat test.txt

[host 1]
group = group1
name = computer1
host = 11.11.11.11
user = root
pass =
private_key =
port = 22
tunnel =
type = ssh
commands =
keepalive = 0
font-color =
back-color =
x11 = True
agent = True
log = False
И есть другой фйлик где туева куча с всякими данными выдираю я всё из него и получаю

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

#!/bin/sh

name=`cat base.ini | grep -1 Sessions | sed 's/\-\-//' | grep group1 | awk -F "/" '{print $2}' | sed 's/..$//' | xargs`

hosts=`cat base.ini | grep -1 Sessions | sed 's/\-\-//' | grep -1 group1 | grep HostName | awk -F "=" '{print $2}' | tr -d '\015' | xargs`

_num=`cat base.ini | grep -1 Sessions | sed 's/\-\-//' | grep group1 | awk -F "/" '{print $2}' | sed 's/..$//' | wc -l`

num=`seq $_num | xargs`


cat test.txt | sed "s/\[host.*/\[host $num\]/" | sed "s/host =.*/host \= $hosts/" | sed "s/name .*/name \= $name/" >> outfile.txt
Переменные обозначают
name имя компа будет заменять name = computer1
hosts хост компа будет заменять host = 11.11.11.11
num - считает и заменяет номер блока [host 1]
Вот как бы мне сделать такой парсер? Нужен цикл, но как там передать 3 переменные я хз...

То что код у меня жесть и можно сделать красивее я знаю там cat можно убрать, но это как пример, о красоте речи не идёт, тут бы функционал...

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 18:52:35
kpp
Не понял.
Что в цикле делать-то нужно?

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 18:57:33
MASiK
kpp писал(а):Не понял.
Что в цикле делать-то нужно?
Ну как что что бы он проходил по файлу test.txt и менял там 3 строчки, и кидал это в другой файл с добавлением (>>) а менял эти 3 строчки читая переменные которые выдают

1="host1 host2 host3 ... host100 host 101" Имя Компа
2="1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 ... 100.100.100.100 .101.101.101.101" Имя хоста
3="1 2 3 4 5 .... 100 101 102 103" Тупо номер

что бы на выходе получилось

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

[host 1]
group = group1
name =comp1
host = 1.1.1.1
user = root
pass =
private_key =
port = 22
tunnel =
type = ssh
commands =
keepalive = 0
font-color =
back-color =
x11 = True
agent = True
log = False

[host 2]
group = group1
name = comp2
host = 2.2.2.2
user = root
pass =
private_key =
port = 22
tunnel =
type = ssh
commands =
keepalive = 0
font-color =
back-color =
x11 = True
agent = True
log = False

[host 3]
group = group1
name = comp3
host = 3.3.3.3
user = root
pass =
private_key =
port = 22
tunnel =
type = ssh
commands =
keepalive = 0
font-color =
back-color =
x11 = True
agent = True
log = False

Ну и так далее

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 20:03:42
FreeBSP
set
shitf

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 20:21:17
MASiK
FreeBSP писал(а):set
shitf
Шивт сдвигает переменные на скока я знаю
сет задаёт постоянные

Чем мне это поможет?

Отличный ответ, и что мне с ним делать?
Мож небольшой примерчик?

Не не прав я про set но это один фиг не то

Команда set позволяет задавать дополнительные опции прямо внутри сценария

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 21:54:26
FiL
~> ./r.sh
1 test1
2 test2
3 test3
4 test4
5 test5
6 test6
7 test7
8 test8
9 test9
10 test10
cat r.sh

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

#!/bin/sh

b=`seq2 10`
c="test1 test2 test3 test4 test5 test6 test7 test8 test9 test10"

for i in $b; do
echo $i `./t.sh $i $c`
done
cat t.sh

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

#!/bin/sh

shift $1
echo $1

Re: [for] несколько переменных в цикле

Добавлено: 2012-01-31 23:03:45
FreeBSP
например так

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 1:48:13
MASiK
FreeBSP писал(а):например так
Примерно так не получится, я sed используя там нельзя использовать `` - Выполняемые кавычки

Тут надо как-то по другому морочится... мне нужен мега профи в SH Script

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 7:07:10
FiL
значит думай как так использовать sed, чтоб оно работало.
Ты-же в качестве переменной в for не собирался использовать sed :)
Как менять две переменных в цикле тебе показали... а дальше уже ты сам думай, кроме тебя никто не знает что ты там ваяешь и почему именно так.

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 11:12:37
kpp
Самое логичное сделать так:
организовать не три отдельных списка
1="host1 host2 host3 ... host100 host 101" Имя Компа
2="1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 ... 100.100.100.100 .101.101.101.101" Имя хоста
3="1 2 3 4 5 .... 100 101 102 103" Тупо номер
,
а один список строк, каждая строка - это набор "name hosts num".

Затем крутануть этот список в цикле

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

echo "${list}" |\
while read name hosts num
do
 # делаем что нужно
done

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 11:19:07
FreeBSP
FreeBSP писал(а):set
shitf

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

> cat masik.txt
[host %_num_%]
group = group1
name = %_name_%
host = %_host_%
user = root
pass =
private_key =
port = 22
tunnel =
type = ssh
commands =
keepalive = 0
font-color =
back-color =
x11 = True
agent = True
log = False
> cat masik.sh
#!/bin/sh

name="host1 host2 host3 host4 host5 host6 host7"
hosts="1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 5.5.5.5 6.6.6.6 7.7.7.7"
num="1 2 3 4 5 6 7"

if [ -z "$1" ]
then
        echo "Using: $0 <pattern.txt>"
        exit 1
else
        pattern=$1
fi

for n in $num
do
        set -- $name
        curname=$1
        shift
        name=$*

        set --  $hosts
        curhost=$1
        shift
        hosts=$*

        echo `cat $pattern | sed s/%_num_%/$n/ | sed s/%_name_%/$curname/ | sed s/%_host_%/$curhost/`


done

> sh masik.sh
Using: masik.sh <pattern.txt>
> sh masik.sh masik.txt
[host 1] group = group1 name = host1 host = 1.1.1.1 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
[host 2] group = group1 name = host2 host = 2.2.2.2 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
[host 3] group = group1 name = host3 host = 3.3.3.3 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
[host 4] group = group1 name = host4 host = 4.4.4.4 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
[host 5] group = group1 name = host5 host = 5.5.5.5 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
[host 6] group = group1 name = host6 host = 6.6.6.6 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
[host 7] group = group1 name = host7 host = 7.7.7.7 user = root pass = private_key = port = 22 tunnel = type = ssh commands = keepalive = 0 font-color = back-color = x11 = True agent = True log = False
>
в качестве домашнего задания - оставить переносы строк в выходе,

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 12:22:48
kpp
2 FreeBSP
Конечно вариант. Работающий.
Но зачем так саблей махать? ;-)
Вот вариант, основанный на моем самом первом ответе, оставленном без должного внимания :roll:

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

name="host1 host2 host3 host4 host5 host6 host7"
hosts="1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 5.5.5.5 6.6.6.6 7.7.7.7"
num="1 2 3 4 5 6 7"

for n in ${num}
do
 curname=`echo "$name" | cut -d " " -f $n`
 curhost=`echo "$hosts" | cut -d " " -f $n`

 sed '/^\[host/s/.*/\[host '$n'\]/
        /^name =/s/name =.*/name = '$curname'/
         /^host =/s/host =.*/host = '$curhost'/' $1
done

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 12:48:25
FreeBSP
есть более одного способа сделать это (с)
где то был список аналогичных фраз для разных языков, что то не могу найти
зато гугол отжигал: Приколы NEXT2

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 12:55:50
kpp
FreeBSP писал(а):есть более одного способа сделать это (с)
Полностью согласен.
Если немного перефразировать фразу из известного произведения:
Все варианты хороши - выбирай на вкус (с)

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 13:13:40
FreeBSP
мне как то давно пришла идея сделать что то аналогичное через сет и шифт, что конкретно - уже не помню =)
и вот тока дошли руки реализовать это
хотя твой вариант красивее =)

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 13:32:36
MASiK
kpp писал(а):2 FreeBSP
Конечно вариант. Работающий.
Но зачем так саблей махать? ;-)
Вот вариант, основанный на моем самом первом ответе, оставленном без должного внимания :roll:
:pardon: Не понял я примера

Спасибо за ответы, очень помогло

НО! Было бы прикольно сделать цикл в который можно пихать более 1ой переменной, это было бы удобно просто

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 13:33:08
MASiK
FreeBSP писал(а):мне как то давно пришла идея сделать что то аналогичное через сет и шифт, что конкретно - уже не помню =)
и вот тока дошли руки реализовать это
хотя твой вариант красивее =)
Честно сказать я до сих пор не понимаю как твой вариант работает ))))

Спасибо ) познавательно )

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 13:44:44
MASiK
kpp писал(а):
FreeBSP писал(а):есть более одного способа сделать это (с)
Полностью согласен.
Если немного перефразировать фразу из известного произведения:
Все варианты хороши - выбирай на вкус (с)
Кстати гениальное решение, забыл отметить, я всё искал как бы использовать одну переменную, почти пришёл к таком варианту как у тебя, что бы выдерать по номеру так как номер самая интересная переменная в данном скрипте, номер это номер строки! )

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 13:50:41
kpp
Не понял я примера
Пример в получении переменной из другого списка с тем же номером по порядку.

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

echo "$c" | awk '{print a" "$a" "aa}' a=$i, aa=123
т.е общий случай

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

echo "$c" | awk '{print $a}' a=$i
эта конструкция эквивалентна конструкции

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

echo "$c" | cut -d " " -f $n
Причем второй эквивалент выполняется быстрее.
НО! Было бы прикольно сделать цикл в который можно пихать более 1ой переменной, это было бы удобно просто
В посте http://forum.lissyara.su/viewtopic.php? ... 12#p319500
я показал как передавать сколько угодно переменных в цикл.

Re: [for] несколько переменных в цикле

Добавлено: 2012-02-01 14:19:36
MASiK
FreeBSP писал(а): в качестве домашнего задания - оставить переносы строк в выходе,
Сделано

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

#!/bin/sh

if [ "$#" = "0" ]; then
echo "Usage "\$1" file"
exit 0
else

name="host1 host2 host3 host4 host5 host6 host7"
hosts="1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 5.5.5.5 6.6.6.6 7.7.7.7"
num="1 2 3 4 5 6 7"
groups="group1 group2 group3 group4 group5 group6 group7"
pattern=$1

for n in $num
do
        set -- $name
        curname=$1
        shift
        name=$*

        set --  $hosts
        curhost=$1
        shift
        hosts=$*

        set --  $groups
        curgroups=$1
        shift
        groups=$*

          sed '/%_num_%/s//'$n'/
                /%_name_%/s//'$curname'/
                 /%_host_%/s//'$curhost'/
                  /%_group_%/s//'$curgroups'/' $pattern


done
fi

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

 cat test.txt
[host %_num_%]
group = %_group_%
name = %_name_%
host = %_host_%
user = root
pass =
private_key =
port = 22
tunnel =
type = ssh
commands =
keepalive = 0
font-color =
back-color =
x11 = True
agent = True
log = False