„Kein gültiger Bezeichner“ beim Lesen der Datei

„Kein gültiger Bezeichner“ beim Lesen der Datei

Bei einer Putty-Remoteverbindung versuche ich, eine Datei Zeile für Zeile zu lesen, jede Zeile mit einem Trennzeichen („;“) abzutrennen und einen Befehl auszuführen, wenn die Variablen eine Bedingung erfüllen. Beim Lesen der Datei erhalte ich jedoch die Meldung „Kein gültiger Bezeichner“.

Nur eine einfache Logik in der Datei test.sh:

while read download.archive
do
    likes = $(echo cut -d ";" -f 1 $line)
    echo $likes
    dislikes = $(echo cut -d ";" -f 2 $line)
    dislikes = $((dislikes * 95))
    url = $(echo cut -d ";" -f 3 $line)

if [$likes -gt $dislikes]
then
    youtube-dl --config-location youtube-dl-3.conf url
fi

done < download.archive

Die Datei download.archive lautet wie folgt:

9873;354;https://www.youtube.com/watch?v=0fd56CGnVRU
3267;54;https://www.youtube.com/watch?v=Mq4jAwPdCMw
25411;871;https://www.youtube.com/watch?v=PcSBOUpgngM
2829;44;https://www.youtube.com/watch?v=S-rj8m7Ssow
921;303;https://www.youtube.com/watch?v=JchVQMuxRVA
2014;32;https://www.youtube.com/watch?v=H8Y_ZfNViPU

Wenn ich jedoch versuche, ./test.sh auszuführen, erhalte ich "./test.sh: line 4: read: 'download.archive': not a valid identifier". Wenn die Datei gültig ist, warum wird dann ein Fehler ausgegeben?

Antwort1

Nach zahlreichen Fehlern ist hier der funktionierende Code:

while IFS= read -r line; do

    likes=$(cut -d ";" -f 1 <<< "$line")
    dislikes=$(cut -d ";" -f 2 <<< "$line")
    likes=$((likes / 50))
    url=$(cut -d ";" -f 3 <<< "$line")

if [ $likes -gt $dislikes ]
then
    youtube-dl --config-location youtube-dl-3.conf $url
fi

done < download.archive

Die erste Zeile des "read"-Befehls ist immer wie oben (readLinie) und die zu lesende Datei steht nach der "done"-Anweisung am Ende (done <Download-Archiv).Dieser Beitrag hiererklärt die IFSund -rErgänzungen und was sie bewirken.

Beim Zuweisen einer Variable kann man vermutlich kein Leerzeichen zwischen die Zuweisung setzen. Daher funktioniert das nicht

likes = $(cut -d ";" -f 1 $line)

Aber das tut es:

likes=$(cut -d ";" -f 1 $line)

...Um jedoch auf die Zeile zu verweisen, die das Programm gerade liest, müssen wir verwenden <<<. Und zwar so:

likes=$(cut -d ";" -f 1 <<< $line)

Schließlich muss bei der Überprüfung einer Bedingung (in der ifAnweisung) ein Leerzeichen zwischen der Anfangs- und der Endklammer und der Bedingung darin vorhanden sein, etwa so:

if [ $likes -gt $dislikes ]

Um auf die Variable zu verweisen url, die unsere URL für youtube-dl enthält, verweisen wir mit einem auf Variablen $. So:

$url

verwandte Informationen