Есть фишки, про которые многие говорят: «я только недавно узнал, что так можно!» Одна из таких - расширенные шаблоны.
▪️ Включаем расширенные шаблоны
shopt -s extglob
Теперь доступны конструкции:
?(pattern) - 0 или 1 совпадение
*(pattern) - 0 или больше
+(pattern) - 1 или больше
@(pattern) - ровно одно из
!(pattern) - всё, кроме
▪️ Полезные примеры
1️⃣ Исключить расширение
for f in !(*.bak); do
echo "Обрабатываю $f"
done
Пробегаем по всем файлам, кроме .bak.
2️⃣ Сгруппировать несколько расширений
for img in *.@(jpg|png|gif); do
echo "Найдено изображение: $img"
done
Ловим только картинки, не заморачиваясь с длинными условиями.
3️⃣ Лестница через case
case $var in
+([0-9])) echo "Это число" ;;
?(http)://*) echo "Это URL" ;;
*.@(sh|bash)) echo "Это Bash-скрипт" ;;
*) echo "Что-то другое" ;;
esac
Можно строить почти регулярочные проверки, но быстрее и нагляднее.
4️⃣ Исключение нескольких типов
for f in !(*.log|*.tmp); do
echo "Чистый файл: $f"
done
Берём всё, кроме .log и .tmp.
5️⃣ Валидация формата прямо в if
if [[ $user == +([a-zA-Z0-9._-]) ]]; then
echo "Имя пользователя валидно"
else
echo "Некорректное имя"
fi
Короткая проверка без grep и regex.
BashTex 📱 #bash #utils