Angenommen, Sie $file
halten einen Wert für einen Dateinamen, sagen wir Dr' A.tif
. Wie kann ich mich bei der Bash-Programmierung von einfachen Anführungszeichen und anderen Sonderzeichen von $file
fernhalten, ohne das Sonderzeichen zu entfernen?
Aktualisierung am 9. Juli 2014
Auf Anfrage von @Gilles wird das folgende Code-Snippet nicht verarbeitet Dr' A.tif
:
files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}
Nachdem ich aus der versucht habe Antwort von @Patrick auf line 1
, so scheint es , für mich zu arbeiten. Aber wenn ich Datei wie Dr\^s A.tif
, printf
Befehl scheint nicht helfen, es zeigt mir Dr\^s\ A.tif
. Wenn ich es manuell auf der Konsole so versuche:
printf "%q" "Dr\^s A.tif"
Ich werde diese Ausgabe haben:
Dr\\\^s\ A.tif
Hast du eine Idee, wie du damit umgehen sollst?
Antworten:
Sie können das
printf
eingebaute mit verwenden%q
, um dies zu erreichen. Beispielsweise:Aus der Bash-Dokumentation über
printf
:quelle
printf '%s' "foo"
. Sie müssen zunächst verstehen, wie das Parsen von Argumenten in der Shell funktioniert. Siehe gnu.org/software/bash/manual/bash.html#Shell-Operation # 2 geschieht vor # 6.printf
und ohne andere ManipulationenIt doesn't have a: ""
printf
. Ihr Problem ist, dass Sie nicht möchten, dass die Shell Ihre Zeichenfolge analysiert. Dazu müssen Sie Ihre Eingabe so an die Shell übergeben, dass sie nicht einmal versucht, sie zu analysieren. Ein Weg, dies zu tun, wäreread -r -p 'input: ' && printf '%q\n' "$REPLY"
, die Eingabe bereitzustellen, wenn Sie dazu aufgefordert werden.printf
. Vielleicht sollten Sie eine Frage stellen, anstatt eine Lösung zu kritisieren, die nichts mit Ihrem Problem zu tun hat.Versuchen:-
oder
oder wenn die Zeichenfolge ein doppeltes Anführungszeichen enthält: -
Es gibt gute Tutorials zum Flüchten und Zitieren im Netz. Beginnen Sie mit diesem .
quelle
Sie müssen keine Dateinamen maskieren, die Sie in einem Skript bearbeiten. Ein Escaping ist nur erforderlich, wenn Sie einen Dateinamen als Literal in ein Skript einfügen oder mehrere Dateinamen als einen einzigen Eingabestream an ein anderes Skript übergeben möchten .
Da Sie die Ausgabe von durchlaufen
find
, ist dies eine der einfachsten Möglichkeiten (!), Mit jedem möglichen Pfad umzugehen :quelle
schnell und (sehr) dreckig
quelle
Viele dieser Antworten, einschließlich der Antworten mit der höchsten Bewertung,
printf "%q"
funktionieren nicht in allen Fällen ohne zusätzliche Manipulation. Ich würde folgendes vorschlagen (Beispiel unten):cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: "" EOF
quelle