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 QUOTING
und HISTORY EXPANSION
fü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"