Моя рекомендація - використовувати 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
зробив би те саме. Це передбачає, що ви завжди знаєте, яке розширення потрібно видалити.