Как добавить текст в файл после проверки, если текст еще не доступен в файле? - PullRequest
0 голосов
/ 28 марта 2020

Я новичок в написании сценариев с bash, и я пытаюсь создать удобный сценарий для загрузки видео с использованием youtube-dl. После получения доступных потоков по ссылке на видео я хочу записать в файл доступные разрешения для данного видео. Это мой код:

#!/bin/bash
youtube-dl -F https://www.youtube.com/watch?v=05X0RRmUtE0 > info.txt
filename='info.txt'
echo Start
cat > res.txt
echo "" > res.txt
while read p; do 
    for i in '240p' '360p' '480p' '720p' '1080p' '2160p'; do
        while read q; do
            if [[$i == $q]]; then 
                break
            else
                echo $i >> res.txt
            fi
        done < res.txt
    done
done < $filename

С текущим сценарием '240p' бесконечно добавляется в 'res.txt'. Я не могу понять, где я иду не так

ОБНОВЛЕНИЕ

Я отредактировал код следующим образом: while read p ; do for i in '240p' '360p' '480p' '720p' '1080p' '2160p' ; do if [[ "$p" == *"$i"* ]]; then while read q; do if [[ "$q" == "$i" ]]; then break else echo $i >> res.txt fi done < res.txt<br> fi done done < info.txt но я все еще не получаю вывод, который я тоже хочу, для тех, кто не понимает, что должен делать скрипт:

1) введите ссылку и извлеките доступные потоки в текстовый файл (youtube-dl -F https://www.youtube.com/watch?v=05X0RRmUtE0 > info.txt)

2) добавьте повторяющиеся разрешения из Потоки в файле info.txt в другой файл res.txt только один раз

1 Ответ

0 голосов
/ 28 марта 2020

Я игнорирую внешний 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 утверждения в одно, но таким образом легче читать, что происходит, поэтому я оставлю это в качестве упражнения для читателя ?

...