Làm thế nào để trích xuất tên tệp mà không có phần mở rộng từ một đường dẫn đầy đủ?


10

Tôi đang cố gắng chỉnh sửa tập lệnh bash đầu tiên của mình và tại một thời điểm, tên tệp được chuyển đến tập lệnh dưới dạng $1. Tôi cần trích xuất tên tập tin mà không cần phần mở rộng.
Hiện tại, tôi giả sử rằng tất cả các tiện ích mở rộng là ba chữ cái nên tôi xóa 4 ký tự cuối cùng để lấy tên tệp:

a="${1:0:-4}"

Nhưng tôi cần có khả năng làm việc với các tiện ích mở rộng có nhiều hơn ba ký tự, như %~n1trong Windows.
Có cách nào để trích xuất tên tệp mà không cần phần mở rộng từ các đối số không?


Câu trả lời:


27

Cách thông thường để làm điều này trong bash là sử dụng mở rộng tham số. (Xem trang bash man và tìm kiếm "Mở rộng tham số".)

a=${1%.*}

Dấu %hiệu cho thấy mọi thứ khớp với mẫu sau ( .*) từ bên phải, sử dụng kết quả khớp ngắn nhất có thể, sẽ bị xóa khỏi tham số $1. Trong trường hợp này, bạn không cần dấu ngoặc kép (") xung quanh biểu thức.


1
Các mẫu tệp thường như thế này: "Something.eng.ext". Rõ ràng trong trường hợp này, ext là phần mở rộng, nhưng sử dụng $ {1%. *} Sẽ chỉ trả về phần "Something", phải không?
dùng304822

2
Số ${1%.*}sẽ trở lại Something.eng. Nếu bạn muốn loại bỏ mọi thứ ở bên phải của người đầu tiên .bao gồm ., sử dụng ${1%%.*}, sẽ trả lại Something.
garyjohn


0

Một lớp lót trong Bash mà không sử dụng tên cơ sở :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.