Bash-Skriptfehler

Bash-Skriptfehler

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 $buchhandelt sich um eine Variable in Ihrem Bash-Skript.

verwandte Informationen