Решение sh
от Brian Campbell
, хотя и благородное и хорошо выполненное, имеет несколько проблем, поэтому я подумал, что смогу предложить собственное решение bash
.
Проблемы с sh
one:
- Тильда в
~/foo
не распространяется на ваш домашний каталог внутри heredocs. И ни тогда, когда он читается оператором read
или цитируется в операторе rm
. Это означает, что вы получите No such file or directory
ошибок.
- Отключение
grep
и такое для основных операций - глупость. Особенно, когда вы используете дерьмовую оболочку, чтобы избежать «тяжелого» веса удара.
- Я также заметил несколько проблем с цитированием, например, вокруг расширения параметра в его
echo
.
- Хотя это редко, решение не может справиться с именами файлов, которые содержат переводы строк (Практически ни одно решение в
sh
не может справиться с ними - вот почему я почти всегда предпочитаю bash
, это гораздо более пуленепробиваемый и труднее использовать при правильном использовании).
Хотя да, использование /bin/sh
в качестве хэш-банга означает, что вы должны избегать bash
измов любой ценой, вы можете использовать все bash
измы, которые вам нравятся, даже на Убунуту или еще много чего, если вы честны и честны. #!/bin/bash
вверху.
Итак, вот решение bash
, которое меньше, чище, прозрачнее, возможно, «быстрее» и более пуленепробиваемо.
[[ -d $1 && $1 != *[^0-9]* ]] || { echo "Invalid input." >&2; exit 1; }
rm -rf ~/foo/"$1"/bar ...
- Обратите внимание на кавычки вокруг
$1
в выражении rm
!
- Проверка
-d
также не будет выполнена, если $1
пусто, то есть две проверки в одной.
- Я избегал регулярных выражений по причине. Если вы должны использовать
=~
в bash, вы должны поместить регулярное выражение в переменную. В любом случае глобусы, подобные моему, всегда предпочтительнее и поддерживаются в гораздо большем количестве версий bash.