Beim Versuch, das folgende Skript in bash-5.0-6 auszuführen, tritt ein Syntaxfehler auf:
wget -nv -O index.html "https://de.wikibooks.org/w/index.php?title=Spezial%3APrefixindex&namespace=0&from=$buch"
die resultierende Fehlermeldung:
2020-08-24 20:38:51 URL:https://de.wikibooks.org/w/index.php?title=Spezial:Pr%C3%A4fixindex&namespace=0&from=Mathematik%3A_Lineare_Algebra [96400] -> "index.html" [1]
get_wikibooks.sh: 18: Syntax error: Unterminated quoted string
es scheint, dass das Zeichen "%" den Fehler verursacht. Aber wie kann ich das Skript so schreiben, dass es nutzbar ist?
danke im voraus tschüss hans
PS: Mein vollständiger Code lautet:
set -x
#!/bin/bash
buch=$(zenity --entry --title "Download eines Wikibooks" --text "Bitte geben Sie den Buchtitel an:")
buch=$(echo $buch | sed "s/ /_/g")
mkdir -p ~/wikibooks/$buch
cd ~/wikibooks/$buch
wget -nv -O index.html 'https://de.wikibooks.org/w/index.php?title=Spezial%3APrefixindex&namespace=0&from=$buch'
if [ $? -ne 0 ] ; then
zenity --error --title "Download eines Wikibooks - Fehler" \
--text "Ein Fehler ist aufgetreten\! \nÜberprüfen sie die Internet-Verbindung und den Buchtitel."
fi
wget -nv -c $(cat index.html | tr '"' '\n’ | egrep "^/wiki$buch" | sort -u | sed "s#^#https://de.wikibooks.org#")
if [ $? -ne 0 ] ; then
zenity --error --title "Download eines Wikibooks - Fehler" \
--text "Ein Fehler ist aufgetreten\! \nÜberprüfen sie die Internet-Verbindung und den Buchtitel."
fi
for i in $(ls); do sed "s#href=\"/wiki/$buch#href=\"./$buch#g" $i > $i.temp; mv $i.temp $i; done
zenity --info --title "Download eines Wikibooks" --text "Herunterladen des Buches erfolgreich\!"
Antwort1
Der Code enthält Anführungszeichenfehler. Betrachten Sie diese Zeile:
wget -nv -c $(cat index.html | tr '"' '\n’ | egrep "^/wiki$buch" | sort -u | sed "s#^#https://de.wikibooks.org#")
Der tr-Befehl lautet tr '"' '\n’
. Das letzte Anführungszeichen in diesem Befehl ist ein Unicode-Backquote (nicht ASCII). Dies ist als Shell-Einzelanführungszeichen nicht gültig.
Ersetzen tr '"' '\n’
mit tr '"' '\n'
.
Nachdem Sie das getan haben, schneiden Sie Ihren Code aus und fügen Sie ihn ein in shellcheck.net und beheben Sie alle verbleibenden Fehler (wichtig) oder Warnungen (können wichtig sein), die es erkennt.
Antwort2
Das Ausführen desselben Befehls allein funktioniert einwandfrei. Da Sie jedoch innerhalb der URL vorhanden sind , wird es möglicherweise als Variable gezählt, da Sie try $
verwenden :"
wget -nv -O index.html 'https://de.wikibooks.org/w/index.php?title=Spezial%3APrefixindex&namespace=0&from=$buch'
Beachten Sie die '
einfachen Anführungszeichen. „es sei denn“, es $buch
handelt sich um eine Variable in Ihrem Bash-Skript.