В качестве примера работающей (только для bash - не /bin/sh
совместимой) альтернативы рассмотрим:
if dirs=( "$name"*/ ) && [[ -d ${dirs[0]} ]]; then
echo "Directories starting with $name already exist"
fi
- Назначение массива работает с любым количеством совпадений
- ... но первая запись в массиве будет действительным каталогом только в том случае, если глоб успешно расширился (а завершающий
/
в выражении глобуса не позволяет ему расширяться во все , кроме каталогов, поэтомуесли у результата вообще есть какие-либо каталоги, вы знаете, что все элементы, в которые он был расширен, являются каталогами).
Если вам нужно что-то, что работает для /bin/sh
какхорошо, рассмотрим следующую функцию:
directoriesExist() { [ -d "$1" ]; }
if directoriesExist "$name"*/; then
echo "Directories starting with $name already exist"
fi
Это работает, потому что список совпадений расширяется до списка аргументов функции, фактически служа альтернативой массиву.
Потому что [
- это встроенная оболочка, эти подходы, основанные на глобальных вычислениях, имеют гораздо меньшие затраты на постоянные коэффициенты, чем подходы, зависящие от внешних инструментов, что сделает их значительно более быстрыми.ll (за исключением некоторых угловых случаев, таких как каталоги, настолько большие, что предпочтительно останавливаться после того, как найдено первое совпадение;где find . -name "$name*" -print -quit
может быть полезно).