Показанный код не выполняет то, что вы думаете (и утверждаете в своем вопросе).
Ваша команда curl
выбирает Интернет и выбрасывает его в стандартный вывод: вы не сохраняете эту информацию длябудущее использование .Затем ваш wc
не имеет никаких параметров, поэтому начинает читать со стандартного ввода .А в stdin у вас есть список имен пользователей из $filename
, поэтому вычисляемое число - это не символы сети, а остальные символы файла.Как только это будет учтено, в stdin ничего не останется для чтения, поэтому цикл заканчивается, потому что он дошел до конца файла.
Вы ищете что-то вроде:
#!/bin/bash
filename="$1"
set -o pipefail
rm -f output.txt
while read username; do
x=$(curl -fs "http://example.website.domain/$username/index.html" | wc -m)
if [ $? -eq 0 ]
then
echo "$username $x" >> output.txt
else
echo "The page doesn't exist"
fi
done < "$filename"
Здесь полученная страница напрямую подается на wc
.Если произойдет сбой curl
, вы не увидите этого (по умолчанию код выхода серии переданных команд является кодом выхода последней команды), поэтому мы используем set -o pipefail
, чтобы получить код выхода самого правого кода выхода с помощьюзначение, отличное от нуля.Теперь вы можете проверить, все ли прошло нормально, и в этом случае вы можете записать результат.
Я также добавил rm
выходного файла, чтобы убедиться, что мы не увеличиваем существующий, и изменилперенаправление к выходному файлу в приложение, чтобы избежать повторного создания файла на каждой итерации и в конечном итоге получить результат последней итерации (спасибо @tripleee за это замечание).
Обновление (по популярному запросу):
Шаблон:
<cmd>
if [ $? -eq 0 ]...
обычно плохая идея.Лучше пойти на:
if <cmd>...
Так что было бы лучше, если вы переключитесь на:
if x=$(curl -fs "http://example.website.domain/$username/index.html" | wc -m); then
echo...