Ich habe mir eine grundlegende Idee ausgedacht, um das Entfernen einer Reihe von Ordnern zu automatisieren, wenn diese nicht mehr benötigt werden.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Dies wird wie folgt hervorgerufen:
./myscript.sh <{id-number}>
Das Problem ist, dass wenn Sie vergessen, das einzugeben id-number
(wie ich es gerade getan habe) , möglicherweise viele Dinge gelöscht werden, die Sie wirklich nicht löschen möchten.
Gibt es eine Möglichkeit, den Befehlszeilenparametern irgendeine Form der Validierung hinzuzufügen? In meinem Fall wäre es gut zu überprüfen, ob a) es einen Parameter gibt, b) er numerisch ist und c) dieser Ordner existiert; bevor Sie mit dem Skript fortfahren.
quelle
Die
sh
Lösung vonBrian Campbell
, obwohl edel und gut ausgeführt, hat ein paar Probleme, also dachte ich, ich würde meine eigenebash
Lösung anbieten.Die Probleme mit dem
sh
einen:~/foo
sich nicht auf Ihr Heimatverzeichnis innerhalb von Heredocs. Und weder, wenn es von derread
Aussage gelesen noch in der Aussage zitiert wirdrm
. Was bedeutet, dass SieNo such file or directory
Fehler bekommen .grep
und dergleichen für Grundoperationen ist dumm. Besonders wenn Sie eine beschissene Schale verwenden, um das "schwere" Gewicht von Bash zu vermeiden.echo
.sh
kann damit umgehen - weshalb ich es fast immer vorziehebash
, es ist weitaus kugelsicherer und schwerer auszunutzen, wenn es gut verwendet wird).Während die Verwendung
/bin/sh
für Ihren Hashbang bedeutet, dass Siebash
Ismen um jeden Preis vermeiden müssen , können Sie allebash
Ismen verwenden, die Sie mögen, sogar unter Ubuntu oder so weiter, wenn Sie ehrlich sind und ganz#!/bin/bash
oben stehen.Hier ist eine
bash
Lösung, die kleiner, sauberer, transparenter, wahrscheinlich "schneller" und kugelsicherer ist.$1
in derrm
Anweisung!-d
Prüfung schlägt auch fehl, wenn sie$1
leer ist. Das sind also zwei Prüfungen in einer.=~
in bash verwenden müssen, sollten Sie den regulären Ausdruck in eine Variable einfügen. In jedem Fall sind Globs wie meine immer vorzuziehen und werden in weitaus mehr Bash-Versionen unterstützt.quelle
$1 != *[^0-9]*
Bash dann spezifisch?Ich würde Bashs verwenden
[[
:Ich fand diese FAQ eine gute Informationsquelle.
quelle
Nicht so kugelsicher wie die obige Antwort, aber dennoch effektiv:
quelle
Verwenden Sie
set -u
diese Option, um zu verhindern, dass ein nicht festgelegter Argumentverweis das Skript sofort fehlschlägt.Weitere Informationen finden Sie im Artikel: Schreiben robuster Bash-Shell-Skripte - David Pashley.com .
quelle
Die Manpage für test (
man test
) enthält alle verfügbaren Operatoren, die Sie als boolesche Operatoren in bash verwenden können. Verwenden Sie diese Flags am Anfang Ihres Skripts (oder Ihrer Funktionen) für die Eingabevalidierung wie in jeder anderen Programmiersprache. Beispielsweise:quelle
Verwenden Sie '-z', um nach leeren Zeichenfolgen zu suchen, und '-d, um nach Verzeichnissen zu suchen.
quelle
Sie können die Punkte a und b kompakt validieren, indem Sie Folgendes tun:
Welches gibt uns ...
Diese Methode sollte in sh gut funktionieren.
quelle
Einzeiler-Bash-Argumentvalidierung mit und ohne Verzeichnisvalidierung
Hier sind einige Methoden, die für mich funktioniert haben. Sie können sie entweder im globalen Skript-Namespace verwenden (wenn Sie im globalen Namespace nicht auf die in die Funktion integrierten Variablen verweisen können)
schnell und schmutzig ein Liner
Ausgabe:
Züchter - Name und Verwendung der Lieferfunktion
Ausgabe:
Fügen Sie eine komplexe Validierungslogik hinzu, ohne Ihre aktuelle Funktion zu überladen
Fügen Sie die folgende Zeile in die Funktion oder das Skript ein, die bzw. das das Argument empfängt.
Sie können dann eine Validierungsfunktion erstellen, die ungefähr so funktioniert
und eine Die-Funktion, die das Skript bei einem Fehler abbricht
Fügen Sie für zusätzliche Argumente einfach eine zusätzliche Zeile hinzu und replizieren Sie das Format.
quelle
Alter Beitrag, aber ich dachte, ich könnte trotzdem etwas beitragen.
Ein Skript ist wohl nicht erforderlich und könnte mit einer gewissen Toleranz gegenüber Platzhaltern über die Befehlszeile ausgeführt werden.
wild überall passend. Entfernen Sie alle Vorkommen von Unterordnern.
Shell iteriert. Entfernen Sie die spezifischen Vor- und Nachordner mit einer Zeile
Shell iteriert + var (BASH getestet).
quelle