Câu trả lời:
FILE=$(basename "${1/%.jpeg/.jpg}")
đã làm cho tôi.
kiểm tra:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
nội dung kịch bản:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Bạn không thể mở rộng tổ trong bash (cũng không phải trong ksh, tro và các vỏ khác ngoài zsh). Đây chỉ là một giới hạn mỹ phẩm, vì như bạn minh họa, bạn có thể gán một biểu thức trung gian cho một biến tạm thời. Nó hơi khó chịu đối với một lớp lót, nhưng trong các kịch bản, nó tốt hơn nhiều cho khả năng đọc.
Bạn có thể tránh sử dụng tiện ích bên ngoài basename
và sử dụng cấu trúc thao tác chuỗi thay thế:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Ở đây, điều xảy ra là bạn có thể viết lại tập lệnh của mình để đặt lệnh thay thế ở bên ngoài . Đó không phải là một hiện tượng chung, bạn cũng không đạt được gì ngoài cảm giác một lớp lót nhất định.
Zsh, tốt hơn hay tồi tệ hơn, không cho phép bạn mở rộng lồng nhau:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Hoặc bạn có thể sử dụng cấu trúc dựng sẵn của zsh thay vì basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Dòng
FILE=$(basename "${1/%.jpeg/.jpg}")
có thể rút ngắn và làm cho di động hơn với
FILE=$(basename "${1%.jpeg}.jpg")
sed
chắc chắn sẽ rất cần thiết, tôi đoán vậy.