цикл while со счетчиком вниз

avatar
Emad
8 августа 2021 в 18:14
65
2
0

У меня есть список URL-адресов в текстовом файле следующего вида

https://example.com/test.php?x=1
https://example.com/test.php?x=1&y=2

и я выполняю цикл while при выполнении определенной команды в этих строках следующим образом

while read line ;
        do command ;
done < list.txt

Мне нужно напечатать на терминале счетчик вниз в функции цикла, чтобы я мог узнать расчетное время до конца списка или другое слово, чтобы узнать оставшиеся строки до конца списка.

я пробовал awk -v x="$url" '$0~x {print NR} но не получилось

Источник
user2849202
8 августа 2021 в 18:24
0

Если вы ссылаетесь на line в command, используйте двойные кавычки: "$line", потому что у вас могут быть такие символы, как &в $line, которые имеют особое значение для bash.

user2849202
8 августа 2021 в 18:27
0

кстати, вам не нужно заканчивать строки ;.

markp-fuso
8 августа 2021 в 18:34
0

не уверен, что понимаю, что вы подразумеваете под print ... counter down in loop; вы имеете в виду что-то вроде processing URL #3 of 10 ... (где 10 — количество URL-адресов/строк в list.txt)? или вы имеете в виду что-то другое? было бы полезно, если бы вы предоставили несколько строк ожидаемого вывода, поскольку URL-адреса обрабатываются в вашем цикле while

Emad
8 августа 2021 в 19:22
0

@markp-fuso да, желаемый вывод будет processing URL #3 of 10, что 10 - это количество строк в файле

Ответы (2)

avatar
markp-fuso
8 августа 2021 в 19:27
2

Образец ввода:

$ cat list.txt
https://example.com/test.php?x=1
https://example.com/test.php?x=1&y=2
https://example.com/test.php?x=1&y=3
https://example.com/test.php?x=1&y=4
https://example.com/test.php?x=1&y=5
https://example.com/test.php?x=1&y=6
https://example.com/test.php?x=1&y=7

Одна идея:

urlcount=$(wc -l < list.txt)
loopcount=0

while read -r url
do
    ((loopcount++))
    echo "Processing URL #${loopcount} (of ${urlcount}) [ ${url} ] ..."

    sleep 3     # replace with 'command ...'

done < list.txt

echo "Done."

Что генерирует следующий вывод (строки печатаются с интервалом в 3 секунды):

Processing URL #1 (of 7) [ https://example.com/test.php?x=1 ] ...
Processing URL #2 (of 7) [ https://example.com/test.php?x=1&y=2 ] ...
Processing URL #3 (of 7) [ https://example.com/test.php?x=1&y=3 ] ...
Processing URL #4 (of 7) [ https://example.com/test.php?x=1&y=4 ] ...
Processing URL #5 (of 7) [ https://example.com/test.php?x=1&y=5 ] ...
Processing URL #6 (of 7) [ https://example.com/test.php?x=1&y=6 ] ...
Processing URL #7 (of 7) [ https://example.com/test.php?x=1&y=7 ] ...
Done.
Emad
8 августа 2021 в 19:48
0

спасибо, это сработало для меня, плюс я добавил ```echo -e "\nОбработка URL #${loopcount} (из ${urlcount}) [${url}]\n"

markp-fuso
8 августа 2021 в 19:52
1

конечно, это тоже работает :-) для дополнительного форматирования (например, \n) я обычно использую printf, так как echo [-e] не всегда реализуется одинаково в различных средах unix/linux, ymmv...

avatar
Ed Morton
8 августа 2021 в 20:31
1
$ cat tst.sh
#!/usr/bin/env bash

readarray -t urls < "${@:--}"

for i in "${!urls[@]}"; do
    printf '%d/%d URL: %s\n' "$((i+1))" "${#urls[@]}" "${urls[i]}"
done

$ ./tst.sh file
1/4 URL: https://example.com/test.php?x=1
2/4 URL: https://example.com/test.php?x=1&y=2
3/4 URL: https://example.com/test.php?x=1&y=3
4/4 URL: https://example.com/test.php?x=1&y=4