Пытаюсь создать сценарий с использованием 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"
Спасибо
Присваивание 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