Моя рекомендация заключается в использовании basename
.
Это по умолчанию в Ubuntu, визуально простой код и имеет дело с большинством случаев.
Вот некоторые подслучаи для работы с пробелами и многоточечным / под-расширением:
pathfile="../space fld/space -file.tar.gz"
echo ${pathfile//+(*\/|.*)}
Обычно он сначала избавляется от расширения .
, но на нашем ..
пути терпит неудачу
echo **"$(basename "${pathfile%.*}")"**
space -file.tar # I believe we needed exatly that
Вот важное примечание:
Я использовал двойные кавычки внутри двойных кавычек, чтобы иметь дело с пробелами. Одиночная кавычка не пройдет из-за отправки $. Bash необычен и читает «вторые» первые «цитаты» из-за расширения.
Тем не менее, вам все еще нужно думать о .hidden_files
hidden="~/.bashrc"
echo "$(basename "${hidden%.*}")" # will produce "~" !!!
не ожидаемый "" результат. Чтобы это произошло, используйте $HOME
или /home/user_path/
потому что bash снова "необычен" и не расширяет "~" (поиск bash BashPitfalls)
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.*}")'
basename $filename .exe
сделал бы то же самое. Это при условии, что вы всегда знаете, какое расширение вы хотите удалить.