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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-01-31 17:47:59

Собственно сабж как бы так сделать что бы было несколько переменных в цикле?

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

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

#!/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
Вот ка-то так
Самурай

Хостинговая компания 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/

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-01-31 17:59:25

Так нельзя.
Предлагаю так:

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

#!/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
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-01-31 18:49:05

Не так всё просто, постараюсь объяснить поподробнее чего хочу сделать

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

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

 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 можно убрать, но это как пример, о красоте речи не идёт, тут бы функционал...
Самурай

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-01-31 18:52:35

Не понял.
Что в цикле делать-то нужно?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-01-31 18:57:33

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

Ну и так далее
Самурай

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2012-01-31 20:03:42

set
shitf
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-01-31 20:21:17

FreeBSP писал(а):set
shitf
Шивт сдвигает переменные на скока я знаю
сет задаёт постоянные

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

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

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

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

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

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

Непрочитанное сообщение FiL » 2012-01-31 21:54:26

~> ./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

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2012-01-31 23:03:45

например так
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-02-01 1:48:13

FreeBSP писал(а):например так
Примерно так не получится, я sed используя там нельзя использовать `` - Выполняемые кавычки

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

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

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

Непрочитанное сообщение FiL » 2012-02-01 7:07:10

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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-02-01 11:12:37

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

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2012-02-01 11:19:07

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
>
в качестве домашнего задания - оставить переносы строк в выходе,
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-02-01 12:22:48

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
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2012-02-01 12:48:25

есть более одного способа сделать это (с)
где то был список аналогичных фраз для разных языков, что то не могу найти
зато гугол отжигал: Приколы NEXT2
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-02-01 12:55:50

FreeBSP писал(а):есть более одного способа сделать это (с)
Полностью согласен.
Если немного перефразировать фразу из известного произведения:
Все варианты хороши - выбирай на вкус (с)
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

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

Непрочитанное сообщение FreeBSP » 2012-02-01 13:13:40

мне как то давно пришла идея сделать что то аналогичное через сет и шифт, что конкретно - уже не помню =)
и вот тока дошли руки реализовать это
хотя твой вариант красивее =)
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-02-01 13:32:36

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

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

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

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-02-01 13:33:08

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

Спасибо ) познавательно )
Самурай

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-02-01 13:44:44

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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-02-01 13:50:41

Не понял я примера
Пример в получении переменной из другого списка с тем же номером по порядку.

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

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

Аватара пользователя
MASiK
лейтенант
Сообщения: 625
Зарегистрирован: 2008-09-19 20:09:41
Откуда: Оттуда
Контактная информация:

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

Непрочитанное сообщение MASiK » 2012-02-01 14:19:36

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
Самурай