Đề nghị của tôi là sử dụng basename
.
Theo mặc định, nó là Ubuntu, mã đơn giản trực quan và giải quyết phần lớn các trường hợp.
Dưới đây là một số trường hợp phụ để xử lý khoảng trắng và nhiều dấu chấm / phần mở rộng phụ:
pathfile="../space fld/space -file.tar.gz"
echo ${pathfile//+(*\/|.*)}
Nó thường được loại bỏ phần mở rộng từ đầu tiên .
, nhưng thất bại trong ..
con đường của chúng tôi
echo **"$(basename "${pathfile%.*}")"**
space -file.tar # I believe we needed exatly that
Đây là một lưu ý quan trọng:
Tôi đã sử dụng dấu ngoặc kép bên trong dấu ngoặc kép để xử lý khoảng trắng. Một trích dẫn sẽ không vượt qua do nhắn tin cho $. Bash là không bình thường và đọc "trích dẫn" thứ hai "đầu tiên" do mở rộng.
Tuy nhiên, bạn vẫn cần phải nghĩ đến .hidden_files
hidden="~/.bashrc"
echo "$(basename "${hidden%.*}")" # will produce "~" !!!
không phải là kết quả "" mong đợi. Để làm cho nó xảy ra sử dụng $HOME
hoặc /home/user_path/
vì một lần nữa bash là "không bình thường" và không mở rộng "~" (tìm kiếm bash BashPit thác)
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.*}")'
basename $filename .exe
sẽ làm điều tương tự. Đó là giả sử bạn luôn biết phần mở rộng nào bạn muốn xóa.