Список установленных пакетов и дотфайлов в вашем доме - хорошая ставка.
Управление dotfiles - это своего рода искусство, check
Если у вас есть фиксированное расширение, POSIX basename
поддерживает именно ту обрезку, которую вы пытаетесь сделать:
basename "$var" .ext
Если нет, расширение zsh поддерживает именно то, что вы пытаетесь:
Если выражение параметра типа $ {...} или подстановка команды типа $ (...) используется вместо имени выше, оно сначала раскрывается, а результат используется так, как если бы он были значением имени. Таким образом, можно выполнять вложенные операции: $ {$ {foo # head}% tail} заменяет значение $ foo удаленными "head" и "tail".
Итак, zsh
echo ${${var##*/}%.*}
сделает то, что вы ожидали.
Если вы привержены Bash и хотите сохранить строки, вы можете использовать sed:
sed -e 's/\.[^.]*$//' <<<"${var##*/}"
Это просто замена регулярным выражением всего, что находится после последнего .
ни с чем, после потери префикса так же, как и сейчас. Однако я не вижу такой экономии памяти по сравнению с двухстрочной версией, и, вероятно, это тоже менее понятно.
Обратите внимание, что нет причин, по которым вы не можете использовать одну и ту же переменную прямо в процессе:
var2=${var##*/}
var2=${var2%.*}
Расширение происходит до присваивания, так что это безопасно. Если вас беспокоит, что действительно длинное имя файла сохраняется дважды, этого не произойдет сейчас, но я не думаю, что это реальная проблема.