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 IFS
und -r
Ergä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 if
Anweisung) 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