LINUX.ORG.RU

Два поочередных цикла в Bash

 , ,


0

2

Прошу помощи с Bash, начал разбираться недавно, нужно решить одну задачу. Есть два списка (list1: 1 2 3 и list2: a b c). Нужно, чтобы значения выводились поочередно таким образом:
1
а
2
b
3
c
...


Как я это вижу:


for x in `cat list1`; do
echo $x
for y in `cat list2`; do
echo $y
continue 2
done
done

В чем ошибка?



Последнее исправление: donalddick (всего исправлений: 1)

Ответ на: комментарий от anonymous

Не то написал. Оно работает, если в первом листе цифры.

list1=(x y z)
list2=(a b c)
i=0

while [ $i -lt ${#list1[@]} ]; do
    echo ${list1[$i]}
    echo ${list2[$i]}
    let i=i+1
done

Так пойдёт?

anonymous
()
Ответ на: комментарий от anonymous

В том и дело, что значения не простые (x,y,z,a,b,c), а сложные, для этого и сделал списки. Это все просто в пример:)

donalddick
() автор топика
Ответ на: комментарий от anonymous

И если в первом списке будут не числа, а что-то другое, всё перестанет работать.

#!/bin/bash

list1=(1 2 3)
list2=(a b c)

i=0
while [ $i -lt ${#list1[@]} ]
do
  echo ${list1[$i]}
  echo ${list2[$i]}
  i=$[$i+1]
done
shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Да, запарил. Хотел сначала сделать со счётчиком, потом подумал, что у него там циферки специально так. Запрос непонятный.

to donalddick

В том и дело, что значения не простые (x,y,z,a,b,c), а сложные

А что мешает сформировать лист из этих сложных значений?

anonymous
()
Ответ на: комментарий от anonymous

Их много. Если конкретно по задаче:

Нужно поднять прокси на базе 3proxy. Для каждого прокси своя связка логин-пароль. Данные для «<USER>:CL:<PASS>» нужно брать из одного списка, данные для «<PORT2>» - из второго, для <IPv6> - из третьего. Как это реализовать?

auth strong
users <USER>:CL:<PASS>
allow <USER>
proxy -6 -n -a -p<PORT1> -i<IPv4> -e<IPv6>

flush
auth strong
users <USER2>:CL:<PASS2>
allow <USER2>
proxy -6 -n -a -p<PORT2> -i<IPv4> -e<IPv6>
...

donalddick
() автор топика
Ответ на: комментарий от donalddick

Данные для «<USER>:CL:<PASS>» нужно брать из одного списка, данные для «<PORT2>» - из второго, для <IPv6> - из третьего.

Откуда поступают данные? Из файла?

anonymous
()
Ответ на: комментарий от donalddick
#!/bin/bash

file1=`cat file1`
file2=`cat file2`
i=0
readarray -t list1 <<<"$file1"
readarray -t list2 <<<"$file2"

while [ $i -lt ${#list1[@]} ]; do
    echo ${list1[$i]}
    echo ${list2[$i]}
    let i=i+1
done

Это если записи в файле разделены переводом строки.

anonymous
()

Не слушай этих велосипедостроителей

# cat AAA
111
222
333
444
555
# cat BBB
aa
bbb
ccc
dddd
eeee
# paste -d '\n' AAA BBB
111
aa
222
bbb
333
ccc
444
dddd
555
eeee

legolegs ★★★★★
()
Ответ на: комментарий от shell-script

Их там целая пачка: paste, cut, join, comm и ещё какие-то. Они в мане не очень подробно описаны, в инфо поподробнее.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Уже посмотрел. Большинство остальных мне известны, именно paste не встречал раньше.

shell-script ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.