Câu hỏi thực sự là, tại sao bất kỳ hệ điều hành nào cũng có ý nghĩa trong '.' ? Không có lý do kỹ thuật để làm như vậy, đó chỉ là một tiêu chuẩn có thể giúp bạn giả sử loại tệp mà không cần kiểm tra.
Nếu bạn đổi tên tệp MP3 thành .txt và cố gắng mở tệp đó trong windows, bạn sẽ thấy ngay lý do tại sao ý tưởng đó có nhược điểm: bạn đột nhiên "không thể" mở tệp chính xác. Về mặt kỹ thuật, không có bất kỳ cân nhắc nào về tốc độ và do đó, cách tốt nhất có thể là xác định loại tệp trước khi quyết định làm gì với nó, vì các tiện ích mở rộng dễ bị xáo trộn và có thể gây ra sự cố.
Lý do linux không quan tâm đến một khoảng thời gian trong tên là cùng một lý do mà một người không sử dụng máy tính không có: không có sự khác biệt vốn có giữa một thời kỳ và bất kỳ nhân vật nào khác ngoài thực tế là một số chương trình được mã hóa để xem thời kỳ đó và đối xử với nó đặc biệt
Giả sử bạn thực sự chỉ muốn tiện ích mở rộng (đó không phải là điều mà cả hai đoạn trích của bạn làm), bạn có thể sử dụng điều này:
ext(){
extension=
[[ $1 =~ \. ]] && extension="${1##*.}"
echo "$1 -> ${extension:-No extension}"
}
ext something. # something. -> No extension
ext something.txt # something.txt -> txt
ext something # something -> No extension
ext som.thing.mp3 # som.thing.mp3 -> mp3
ext .whatever # .whatever -> whatever
* Lưu ý rằng cuối cùng.
Nếu bạn thực sự muốn trả lại tên tệp khi không có phần mở rộng, giống như mã của bạn, không có lý do gì để sử dụng đoạn mã thứ hai dài, kiểu SH mà bạn có. Bạn đã viết:
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
Đó thực sự chỉ là:
ext(){
extension="${1##*.}"
# This line is what your first snippet is doing:
# echo "$extension"
# This line is what your second snippet is doing:
[[ $extension ]] && echo "$extension" || echo "$1"
}
Đó thực sự chỉ là:
# First snippet
ext(){
echo "${1##*.}"
}
# Second snippet
ext(){
extension="${1##*.}"
echo "${extension:-$1}"
}
Về cơ bản, bạn không thể chấp nhận bất cứ điều gì mà người dùng có thể nhập vào. Nếu bạn muốn xem loại tập tin thực sự là gì, hãy thử lệnh tập tin. Bởi vì phân tích tên tệp để cố gắng tìm ra loại tệp không phải là cách duy nhất để lột da con mèo đó. Bạn thậm chí có thể có một tên tệp trong linux được gọi đơn giản là: \
example.tar.gz
bạn sẽ loại bỏ tất cả các hậu tố bắt đầu từ dấu chấm đầu tiên, sẽ không có phần mở rộng duy nhất cần thiết để gọi đúng chương trình để xử lý. Và nếu tên tệp của bạn không có "phần mở rộng" được phân tách bằng dấu chấm, thì chức năng của bạn sẽ in toàn bộ tên đã nhập, vì vậy bạn cần kiểm tra thêm để trả về một chuỗi trống trong trường hợp đó.