LINUX.ORG.RU

Два цикла for (bash)

 , ,


0

1

Есть цикл for в котором должны выполняться 2 программы (допустим prog1 и prog2). prog1 имеет 2 аргумета(определяющих файлы в каталоге), которые должны меняться по мере выполнения цикла. prog2 имеет один аргумет, который также должен меняться по мере выполнения цикла for.

Пока так:

for arg in 'ls -1'
    do
prog1 -$1arg -$2arg 
#допустим $1arg это 'ls -1 fog' , а $2arg это 'ls -1 animal/frog'
#Как можно реализовать изменение этих 2-х аргументов?
prog2 -$arg
    done


Ээ, как реализовать изменение переменной? Ставишь какую-то логику в цикл, и там меняешь, например?

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

Как объявить 3 переменных в самом условии цикла?

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

fog и frog это папки. prog1, prog2 это кодовое название моей программы.

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

Мне надо что бы значения переменных 1arg и 2arg задавались единожды в начале цикла, а дальше менялись бы по мере выполнения, принимая значения файлов в определенной папке (по очереди).

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

какая-то бредятина. Это учебное задание?

В любом случае, написание программы начинается с составления тестового набора исходных данных и соответствующего им набора выходных данных, а уж потом пишется код.

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

значения переменных 1arg и 2arg задавались единожды в начале цикла, а дальше менялись

Так задавались единожды или менялись? Ты уверен что ты понимаешь что такое переменная в баше и как она работает?

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

Задавались единожды в условии цикла несколькими значениями. Например arg1 =`ls -1`, то есть arg1 принимает значение нескольких файлов. И потом по мере выполнения цикла в переменную arg1 подставляется сначала имя первого файла, при 2лм проходе имя второго файла и т.д.

arcan
() автор топика
Ответ на: комментарий от arcan
for a in $(ls /); do echo $a; done

Работать будет только если в именах файлов нет пробелов. Если пробелы есть, придется извращаться.

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

Непонятно, хотите ли вы в теле цикла за итерацию обрабатывать по два файла или как. И если по два, то непонятен смысл этого действия, ведь никак не обеспечено не только упорядочивание файлов в парах, но и просто чётность их общего количества.

legolegs ★★★★★
()
declare -a arg1
declare -a arg2
arg1=(`seq 0 5`)
arg2=(`seq 6 9`)
idx=0
while true
do
  run=
  [ $idx -lt ${#arg1[@]} ] && run=true && echo ${arg1[$idx]}
  [ $idx -lt ${#arg2[@]} ] && run=true && echo ${arg2[$idx]}
  [ -z $run ] && break
  idx=$((idx+1))
done
anonymous
()
Ответ на: комментарий от arcan

зачем задавать переменные именно в начале цикла, а не перед самим циклом? В чём соль?

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

Надо также, но только чтобы была вторая переменная(пусть b) и выводилась она так же как и $a.

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

вместо seq пишешь свои ls. вместо echo свои prog. Если нужно третий список крутить, копируешь все строки где есть arg2 и меняешь 2 на 3.

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

1. idx это индекс списков.

2. понятие каталог исчезает сразу после заполнения массива. Далее это строка.

anonymous
()

Ну, начнём сначала. Запускаем твой псевдокод.

$ for arg in 'ls -1'; do echo $arg; done;
ls -1
Теперь делаем правильные кавычки
$ for arg in `ls -1`; do echo $arg; done;
22
33
44
Разница заметна?

Теперь можешь отвечать на мой ответ.

PS А ну да, посмотрел веточку, так и не увидел что за второй цикл ты имеешь в виду.

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от justAmoment

Теперь делаем правильные кавычки

$ ls
'a a'  'b b'  'c c'

for arg in `ls -1`; do echo $arg; done;
a
a
b
b
c
c

for arg in "`ls -1`"; do echo $arg; done;
a a
b b
c c
mogwai ★★★★
()
Ответ на: комментарий от mogwai

Про пробелы в именах можно отдельно поговорить. Например:" Пробелов в именах быть не должно! Нет пробелов — нет проблем".

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

Судя по формулировке вопроса там и пробелы, и кириллица.

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

Спасибо, то что надо. Значит после присваивания переменной значения нескольких файлов в каталоге, она представляет их как строку, и дальше можно перебирать эти значения, прибавляя к переменной 1, даже если переменная не определена в условии цикла?

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

Теперь я понял. arg1 и arg2 это массив, и скрипт перебирает значения по индексу элемента в массиве. Так?

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

Это да, мена царапнуло «правильные кавычки» и отсутствие оных вокруг команды.

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

Можно ведь создать второй счётчик id (например idx2), который меняется не так как первый (idx).

arcan
() автор топика

второй поток данных (ls -1 dir1/dir2) направь в 3й дескриптор и читай из него (read) по мере надобности

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

Да похрен, что в скрипте-примере, у ТСа-то есть прикладная задача (которую он, правда, не в состоянии сформулировать).

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

1. Проверка конца массива.

2. Признак, что есть хоть один запуск, чтобы выйти когда ни одного не будет

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

То есть текст не имеет значения. (Не обязательно true)?

anonymous
()

for arg in 'ls -1'

Откуда вы все это копируете? Как определить источник заражения?

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