Страница 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
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
Конечно вариант. Работающий.
Но зачем так саблей махать?
Вот вариант, основанный на моем самом первом ответе, оставленном без должного внимания
Код: Выделить всё
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
Конечно вариант. Работающий.
Но зачем так саблей махать?
Вот вариант, основанный на моем самом первом ответе, оставленном без должного внимания

Не понял я примера
Спасибо за ответы, очень помогло
НО! Было бы прикольно сделать цикл в который можно пихать более 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
т.е общий случай
эта конструкция эквивалентна конструкции
Причем второй эквивалент выполняется быстрее.
НО! Было бы прикольно сделать цикл в который можно пихать более 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