J'en ai proposé un de base pour aider à automatiser le processus de suppression d'un certain nombre de dossiers lorsqu'ils deviennent inutiles.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Ceci est évoqué comme ceci:
./myscript.sh <{id-number}>
Le problème est que si vous oubliez de taper le id-number
(comme je l'ai fait juste à ce moment-là) , cela pourrait potentiellement supprimer beaucoup de choses que vous ne voulez vraiment pas supprimer.
Existe-t-il un moyen d'ajouter une forme de validation aux paramètres de ligne de commande? Dans mon cas, il serait bon de vérifier que a) il y a un paramètre, b) c'est numérique, et c) ce dossier existe; avant de continuer avec le script.
la source
La
sh
solution parBrian Campbell
, bien que noble et bien exécutée, a quelques problèmes, alors j'ai pensé fournir ma proprebash
solution.Les problèmes avec celui-
sh
ci:~/foo
ne s'étend pas à votre répertoire d'origine dans heredocs. Et ni quand il est lu par laread
déclaration ou cité dans larm
déclaration. Ce qui signifie que vous obtiendrez desNo such file or directory
erreurs.grep
et autres pour les opérations de base est stupide. Surtout lorsque vous utilisez une coquille de merde pour éviter le poids «lourd» de bash.echo
.sh
peut y faire face - c'est pourquoi je préfère presque toujoursbash
, c'est beaucoup plus à l'épreuve des balles et plus difficile à exploiter lorsqu'il est bien utilisé).Bien que, oui, utiliser
/bin/sh
pour votre hashbang signifie que vous devez éviter lesbash
ismes à tout prix, vous pouvez utiliser tous lesbash
ismes que vous aimez, même sur Ubuntu ou quoi que ce soit lorsque vous êtes honnête et placé#!/bin/bash
au sommet.Voici donc une
bash
solution plus petite, plus propre, plus transparente, probablement "plus rapide" et plus à l'épreuve des balles.$1
de larm
déclaration!-d
vérification échouera également si elle$1
est vide, c'est donc deux vérifications en une.=~
dans bash, vous devriez mettre l'expression régulière dans une variable. Dans tous les cas, les globs comme le mien sont toujours préférables et pris en charge dans des versions beaucoup plus bash.la source
$1 != *[^0-9]*
spécifique?J'utiliserais des bash
[[
:J'ai trouvé que cette FAQ était une bonne source d'informations.
la source
Pas aussi à l'épreuve des balles que la réponse ci-dessus, mais toujours efficace:
la source
Utilisez
set -u
ce qui entraînera l'échec immédiat du script de toute référence d'argument non définie.Veuillez consulter l'article: Écriture de scripts robustes Bash Shell - David Pashley.com .
la source
La page de manuel de test (
man test
) fournit tous les opérateurs disponibles que vous pouvez utiliser comme opérateurs booléens dans bash. Utilisez ces indicateurs au début de votre script (ou de vos fonctions) pour la validation d'entrée, comme vous le feriez dans n'importe quel autre langage de programmation. Par exemple:la source
Utilisez '-z' pour tester les chaînes vides et '-d pour rechercher les répertoires.
la source
Vous pouvez valider les points a et b de manière compacte en procédant comme suit:
Ce qui nous donne ...
Cette méthode devrait fonctionner correctement dans sh.
la source
validation d'argument One Liner Bash, avec et sans validation de répertoire
Voici quelques méthodes qui ont fonctionné pour moi. Vous pouvez les utiliser dans l'espace de noms du script global (si dans l'espace de noms global, vous ne pouvez pas référencer les variables intégrées de la fonction)
une doublure rapide et sale
production:
Fancier - nom de la fonction et utilisation
production:
Ajoutez une logique de validation complexe sans encombrer votre fonction actuelle
Ajoutez la ligne suivante dans la fonction ou le script qui reçoit l'argument.
Vous pouvez ensuite créer une fonction de validation qui fait quelque chose comme
et une fonction die qui abandonne le script en cas d'échec
Pour des arguments supplémentaires, ajoutez simplement une ligne supplémentaire, répliquant le format.
la source
Ancien message mais j'ai pensé que je pourrais contribuer de toute façon.
Un script n'est sans doute pas nécessaire et avec une certaine tolérance aux caractères génériques pourrait être exécuté à partir de la ligne de commande.
wild n'importe où correspondant. Permet de supprimer toute occurrence de sous "dossier"
Shell a répété. Permet de supprimer les dossiers spécifiques pré et post avec une seule ligne
Shell itéré + var (testé BASH).
la source