Entpacken einer Datei mit Ausrufezeichen aus der Befehlszeile im Bash-Skript

Entpacken einer Datei mit Ausrufezeichen aus der Befehlszeile im Bash-Skript

Ich versuche, ein einfaches Skript zu erstellen, das eine ZIP-Datei entpackt, deren Name ein Ausrufezeichen enthält:

#!/bin/bash
UNZIP='/usr/bin/unzip'
CUT="/usr/bin/cut"
GREP="/usr/bin/grep"
FILENAME="test"

FILE="/usr/local/var/www/htdocs/"$FILENAME"\!3.zip"
UNZIPPEDFOLDER=$($UNZIP ${FILE} | $GREP -m1 'creating:' | $CUT -d' ' -f5-)
echo $UNZIPPEDFOLDER

aber wenn das Skript ausgeführt wird, gibt unzip Folgendes zurück:

unzip:  cannot find or open /usr/local/var/www/htdocs/test\!3.zip, /usr/local/var/www/htdocs/test\!3.zip.zip or /usr/local/var/www/htdocs/test\!3.zip.ZIP.

Es funktioniert gut, wenn der Dateiname kein „!“-Zeichen enthält, aber um einen Teil meiner Arbeit zu automatisieren, muss ich bei den ursprünglichen Dateinamen bleiben.

Antwort1

!ist das Befehlsverlaufserweiterungszeichen und muss daher in der Befehlszeile in Anführungszeichen gesetzt werden, wenn die Verlaufserweiterung aktiviert ist. Innerhalb eines Skripts muss es nicht in Anführungszeichen gesetzt werden.

Aus der Manpage:

Wenn die Funktionen zur Befehlsverlaufserweiterung verwendet werden (siehe unten „VERLAUFSERWEITERUNG“), muss das Verlaufserweiterungszeichen, normalerweise !, in Anführungszeichen gesetzt werden, um eine Verlaufserweiterung zu verhindern.

Und

Nicht-interaktive Shells führen standardmäßig keine Verlaufserweiterung durch.

Siehe man bash, suchen Sie nach QUOTINGund HISTORY EXPANSIONfür alle Einzelheiten.

Antwort2

Im Allgemeinen muss man nicht fliehenUnd Zitatalles. Die sichere Art, dies zu schreiben, wäre:

FILE="/usr/local/var/www/htdocs/${FILENAME}!3.zip"
UNZIPPEDFOLDER="$("$UNZIP" "$FILE" | "$GREP" -m1 'creating:' | "$CUT" -d' ' -f5-)"
echo "$UNZIPPEDFOLDER"

verwandte Informationen