Ich habe Probleme, die Grundlagen der Bash-Skripterstellung zu verstehen. Folgendes habe ich bisher:
#!/bin/bash
FILES="/home/john/my directory/*.txt"
for f in "${FILES}"
do
echo "${f}"
done
Ich möchte nur alle .txt
Dateien in einer for
Schleife auflisten, damit ich sie bearbeiten kann. Aber der Raum in my directory
und der Stern in spielen *.txt
einfach nicht gut. Ich habe versucht, es mit und ohne doppelte Anführungszeichen, mit und ohne geschweifte Klammern bei Variablennamen zu verwenden, und kann immer noch nicht alle .txt
Dateien drucken .
Das ist eine sehr grundlegende Sache, aber ich habe immer noch Probleme, weil ich müde bin und nicht klar denken kann.
Was mache ich falsch?
Ich konnte das obige Skript erfolgreich anwenden, wenn meine DATEIEN kein Leerzeichen oder Sternchen haben ... Ich musste mit oder ohne doppelte Anführungszeichen und geschweifte Klammern experimentieren, damit es funktioniert. Aber in dem Moment, in dem ich sowohl Leerzeichen als auch ein Sternchen habe, wird alles durcheinander gebracht.
for f in "$DIR"/*.txt
= finefor f in "$DIR/*.txt"
= breaksWährend die Verwendung von Arrays wie von John1024 gezeigt viel sinnvoller ist, können Sie hier auch den Operator split + glob verwenden (wobei eine skalare Variable nicht in Anführungszeichen gesetzt bleibt).
Da Sie nur den Glob-Teil dieses Operators benötigen, müssen Sie den geteilten Teil deaktivieren :
quelle
Sie können nur die Platzhalterzeichen außerhalb der Anführungszeichen belassen.
Etwas wie:
für eine in „Dateien mit Leerzeichen“ * „txt“
do
Verarbeitung
getan
Wenn die Platzhalter sich auf Räume erweitern, dann müssen Sie t eine Datei pro Zeile Ansatz verwenden, wie Verwendung ls -l die Liste der erzeugen Dateien und verwenden Sie bash read, um jede Datei abzurufen.
quelle
Wenn Sie auf Gruppe von Dateien zu verarbeiten mögen, sollten Sie an ihrem Namensraum sein kann , wird es oder andere scape Code, bevor Sie so Ihren Prozess starten, wie
for loop
oderfind command
setzen dasIFS bash env variable
an:quelle