Ich versuche ein Bash-Skript zu schreiben. In diesem Skript soll der Benutzer einen Pfad eines Verzeichnisses eingeben. Dann möchte ich einige Zeichenfolgen am Ende dieser Zeichenfolge anhängen und einen Pfad zu einigen Unterverzeichnissen erstellen. Angenommen, der Benutzer gibt eine Zeichenfolge wie folgt ein:
/home/user1/MyFolder
Jetzt möchte ich 2 Unterverzeichnisse in diesem Verzeichnis erstellen und einige Dateien dort kopieren.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
Wie kann ich das machen?
Antworten:
Der POSIX-Standard schreibt vor, dass mehrere in einem Dateinamen
/
als eine einzige behandelt werden/
. Also//dir///subdir////file
ist das gleiche wie/dir/subdir/file
.Das Verketten von zwei Zeichenfolgen zum Erstellen eines vollständigen Pfads ist daher wie folgt:
quelle
"" + "/" + "Documents"
gibt"/Documents"
../
nach vorne hinzufügen . Aber vielleicht möchte der Benutzer absolute Pfade zusammenfassen. Andernfalls könnten sie einfach./
nach vorne addieren, um zu erzwingen, dass der Pfad relativ ist. Beachten Sie auch, dass dies"$path1/./$path2"
dasselbe ist wie"$path1/$path2"
.Und wenn Sie readline verwenden möchten, um die Fertigstellung und all das zu erhalten, fügen Sie
-e
dem Aufruf ein hinzuread
:quelle
Wird die Verkettung des Teils Ihres Pfades nicht einfach das erreichen, was Sie wollen?
Sie können dann die Ordner / Verzeichnisse nach Bedarf erstellen.
Eine Konvention besteht darin, Verzeichnispfade mit
/
(z. B./home/
) zu beenden, da Pfade, die mit einem / beginnen, mit dem Stammverzeichnis verwechselt werden könnten. Wenn//
in einem Pfad ein doppelter Schrägstrich ( ) verwendet wird, ist dieser ebenfalls weiterhin korrekt. Wenn jedoch für keine der Variablen ein Schrägstrich verwendet wird, ist dies falsch (z/home/user1/MyFoldersubFold1
. B. ).quelle
/home/user1/MyFolder/subFold1
, Sie benötigen also Inlinenew_path=$base/$subdir
. Aber was machen Sie dann, wenn der angegebene Pfad ein abschließendes '/' enthält?newpath=$base/$subdir/
Sie können damit direkt in der Befehlszeile spielenDas folgende Skript verkettet mehrere (relative / absolute) Pfade (BASEPATH) mit einem relativen Pfad (SUBDIR):
Die Ausgabe davon ist:
Das
shopt -s extglob
ist nur notwendig , BASEPATH zu ermöglichen , sich auf mehrere Schrägstriche zu beenden (was wahrscheinlich ist Unsinn). Ohne erweitertes Globing können Sie einfach Folgendes verwenden:was dazu führen würde, dass weniger ordentlich, aber immer noch funktioniert:
quelle
Ich habe mit meinem Shell-Skript herumgearbeitet, das einige Pfadverbindungsaufgaben wie Sie ausführen muss.
Die Sache ist, beide Wege mögen
sind gültig.
Wenn ich eine Datei an diesen Pfad anhängen möchte wie
Es gab keine native Methode (wie os.path.join () in Python) in der Shell, um mit einer solchen Situation umzugehen.
Aber ich habe einen Trick gefunden
Beispielsweise wurde der Basispfad in einer Shell-Variablen gespeichert
und der letzte Dateiname, dem Sie beitreten möchten, war
Dann können Sie Ihren neuen Pfad wie folgt zuweisen
und dann wirst du bekommen
Der Grund ist recht einfach. Der Befehl "realpath" schneidet bei Bedarf immer den abschließenden Schrägstrich für Sie ab
quelle
quelle
Dies sollte für ein leeres Verzeichnis funktionieren (Möglicherweise müssen Sie überprüfen, ob die zweite Zeichenfolge beginnt, mit
/
der als absoluter Pfad behandelt werden soll?):Ausgabe:
Referenz: Erweiterung der Shell-Parameter
quelle