Я игнорирую внешний l oop (read p ... < $filename
), поскольку он не влияет на вопрос, о котором вы спрашиваете, но вам, вероятно, следует проверить, почему он существует, потому что сейчас он ничего не делает.
Первый внутренний l oop (for i in '240p' '360p' ...
) проходит по этому списку и выполняет второй внутренний l oop для каждого значения.
Второй внутренний l oop (read q ... < res.txt
) читает res.txt и сравнивает каждую строку со значением из первого внутреннего l oop. Если значения совпадают, второй внутренний l oop останавливается, и первый внутренний l oop продолжается со следующим значением, перезапуская второй внутренний l oop в начале файла.
Если значения не совпадают, вы добавляете '240p' в файл res.txt. Если он никогда не найдет совпадающее значение, он будет продолжать работать бесконечно, потому что он не просто использует исходное содержимое файла, он также читает строки, добавленные в этот файл во время процесса.
Это означает, что, если файл res.txt не содержит одно из значений первого внутреннего l oop, он застрянет в этом значении и будет продолжать бесконечно добавлять '240p', за исключением случаев, когда в исходном файле нет содержат '240p', в этом случае он будет читать весь файл, добавляя строку '240p' для каждого значения, которое он уже содержит, затем break
, когда он встречает первый добавленный '240p'.
Единственный способ, которым этот код не застрянет, - это если res.txt содержит все значения из первого внутреннего l oop или все, кроме '240p' (которое он добавит, затем fini sh).
РЕДАКТИРОВАТЬ: Что касается решения, я бы выбросил весь внутренний while
l oop, заменив его на grep
:
#!/bin/bash
youtube-dl -F https://www.youtube.com/watch?v=05X0RRmUtE0 > info.txt
echo Start
rm res.txt >/dev/null 2>&1 # remove res.txt if it exists, don't care about warnings if it doesn't exist
touch res.txt # create empty file
while read p ; do
for i in '240p' '360p' '480p' '720p' '1080p' '2160p' ; do
if [[ "$p" =~ "$i" ]]; then # regex matching ensures foo480pbar matches '480p'
if ! grep "$p" res.txt >/dev/null 2>&1; then # if grep fails, res.txt does not contain $p yet
echo $i >> res.txt
fi
fi
done
done < info.txt
Вы могли бы даже выбросить for
l oop и сложить все разрешения в одно соответствие регулярному выражению, и объединить оба if
утверждения в одно, но таким образом легче читать, что происходит, поэтому я оставлю это в качестве упражнения для читателя ?