L' sh
de la solution, en Brian Campbell
, tandis que les nobles et bien exécuté, a quelques problèmes, donc je pensais que je fournir mes propres bash
de la solution.
Les problèmes avec l' sh
d'un:
- Le tilde en
~/foo
ne s'étend pas à votre homedirectory à l'intérieur de heredocs. Et ni quand il est lu par l' read
déclaration ou cité dans l' rm
déclaration. Ce qui signifie que vous obtiendrez No such file or directory
d'erreurs.
- Bifurquer off
grep
et pour les opérations de base, c'est idiot. Surtout quand vous êtes avec un minable shell pour éviter le "lourd" poids de bash.
- J'ai aussi remarqué quelques citant des questions, par exemple autour d'un paramètre d'expansion dans sa
echo
.
- Bien que rares, la solution ne peut pas faire face avec des noms de fichiers qui contiennent des retours à la ligne. (Presque pas de solution en
sh
peut faire face avec eux - c'est pourquoi j'ai presque toujours préférer bash
, il est beaucoup plus à l'épreuve des balles et plus difficile à exploiter, lorsque bien utilisé).
Alors, oui, à l'aide de /bin/sh
pour votre hashbang signifie que vous devez éviter bash
smsi à tous les frais, vous pouvez utiliser tous les bash
isms vous voulez, même sur Ubunutu ou autres joyeusetés lorsque vous êtes honnête et mettre #!/bin/bash
en haut.
Donc, voici un bash
solution qui est plus petit, plus propre, plus transparente, plus probablement "plus vite", et plus l'épreuve des balles.
[[ -d $1 && $1 != *[^0-9]* ]] || { echo "Invalid input." >&2; exit 1; }
rm -rf ~/foo/"$1"/bar ...
- Remarquez les guillemets autour de
$1
dans la rm
!
- L'
-d
vérification échoue également si $1
est vide, de sorte que les deux contrôles.
- J'ai évité les expressions régulières pour une raison. Si vous devez utiliser
=~
de bash, vous devriez être en mettre à l'expression régulière dans une variable. Dans tous les cas, les globules comme le mien sont toujours préférables et pris en charge dans beaucoup plus de versions de bash.