Переменная приращения в bash for loop

Пытаюсь создать сценарий с использованием curl для проверки нескольких URL-адресов на предмет обновленной информации. В настоящее время я использую отдельные команды для каждого URL-адреса, пытаясь сократить строки кода, используя переменные приращения в цикле for . Что у меня есть на данный момент: (фиктивные URL-адреса в качестве примеров)

#!/bin/bash

url01="https://askubuntu1.com"
url02="https://askubuntu2.com"
url03="https://askubuntu3.com"
url04="https://askubuntu4.com"
url05="https://askubuntu5.com"

for i in {01..05}
    do
        url=$((url$i))
        curl $url 2>&1| grep 'askubuntu' >> output.txt
done &

Вывод ошибки:

строка 10: https://askubuntu1.com : синтаксическая ошибка в выражении (токен ошибки: ": / /askubuntu1.com")

Ожидаемый результат: ввод команды в оболочку bash для каждого из curl запрашивает каналы в grep , затем выводит в «output.txt».

curl «https://askubuntu1.com»
curl "https://askubuntu2.com"
.
.
curl "https://askubuntu3.com"

Спасибо

0
задан 29 November 2020 в 05:28

1 ответ

Присваивание url=$((url$i)) пытается вычислить url$i как арифметическое выражение — здесь это не подходит. Вместо этого вы могли бы использовать переменную косвенность:

for url in url{01..05}
do
  curl "${!url}" 2>&1| grep 'askubuntu' >> output.txt
done

Однако было бы, вероятно, чище использовать массив:

#!/bin/bash

urls=(
  "https://askubuntu1.com"
  "https://askubuntu2.com"
  "https://askubuntu3.com"
  "https://askubuntu4.com"
  "https://askubuntu5.com"
)

for url in "${urls[@]}"
do
  curl "$url" 2>&1| grep 'askubuntu' >> output.txt
done

Вы также можете циклически перебирать индексы массива ${!urls[@]} - что даст вам желаемую возрастающую целочисленную переменную, из которой можно построить последовательность пронумерованных выходных файлов, например:

for i in ${!urls[@]}
do
  printf -v output 'file%02d.txt' $((i+1))
  curl "${urls[i]}" 2>&1 | grep 'askubuntu' > "$output"
done

The $((i+1 )) потому, что индексация массива bash начинается с 0 - если вы не возражаете против того, чтобы выходные данные были от file00 до file04, тогда вы можете использовать простой $i.

Для версии, основанной на переменной косвенности, вы можете сделать либо

for i in {01..05}
do
  url="url$i"
  curl "${!url}" 2>&1| grep 'askubuntu' > "file${i}.txt"
done

или

for url in url{01..05}
do
  curl "${!url}" 2>&1| grep 'askubuntu' > "${url/#url/file}.txt"
done
0
ответ дан 29 November 2020 в 01:39

Другие вопросы по тегам:

Похожие вопросы: