Một kỹ thuật khác bạn có thể sử dụng trong bash và một số shell khác là sử dụng một mảng:
$ extensions=(foo bar)
$ ls "${extensions[@]/#/1.}"
Đây là
hình thức (thay thế mẫu) của mở rộng tham số. (Thật không may, điều này cũng không tuân thủ POSIX.) Việc chỉ định rằng việc thay thế nên được áp dụng cho từng phần tử của mảng và nên duy trì sự tách biệt giữa các phần tử.
trong một chuỗi mẫu hoạt động như một biểu thức chính quy (nghĩa là hầu hết các thay thế); điều đó có nghĩa là sự thay thế chỉ xảy ra ở đầu các giá trị tham số. Vì thế${parameter/pattern/string}
[@]
#
^
s/old/new/
$ ls "${extensions[@]/#/1.}"
tương đương với
$ ls "$ {phần mở rộng [ 0 ] / # / 1.}" "$ {phần mở rộng [ 1 ] / # / 1.}"
(vì mảng này có hai phần tử, được lập chỉ mục là 0 và 1) và điều này mở rộng thành
$ ls "1.foo" "1.bar"
Trích dẫn
Các trích dẫn rất quan trọng nếu các tiện ích mở rộng của Phần cứng, yêu cầu các trích dẫn - nghĩa là, nếu chúng (có thể, có thể, bao giờ) chứa các khoảng trắng hoặc ký tự mở rộng tên đường dẫn (global / wildcard). Ví dụ, nếu
$ extensions=("foo bar" "*r")
sau đó
$ ls ${extensions[@]/#/1.}
(không có dấu ngoặc kép) sẽ mở rộng sang
$ ls 1.foo bar 1.*r
(trong đó 1.foo
và bar
là các đối số riêng biệt), và đến lượt nó, mở rộng thành
$ ls 1.foo bar 1.anteater 1.bar 1.bear 1.cougar 1.deer 1.grasshopper …
(vì 1.*r
là một ký tự đại diện không được trích dẫn). Để thảo luận thêm về tầm quan trọng của việc trích dẫn, hãy xem Hàm ý bảo mật của việc quên trích dẫn một biến trong các vỏ bash / POSIX .
Bạn cũng có thể khớp phần cuối của chuỗi bằng cách sử dụng %
trong mẫu :
$ fnames=(cat dog)
$ ls "${fnames[@]/%/.c}"
mở rộng đến
$ ls "cat.c" "dog.c"
Nhưng hãy cẩn thận: %
không hoạt động giống như $
trong các biểu thức thông thường. Bạn cần phải đặt nó ở đầu của mô hình
để chế ngự trận đấu xảy ra ở phần cuối của các giá trị tham số. Ví dụ, nếu bạn có
$ fnames=(cat.c dog.c)
và bạn muốn có được cat.o
và dog.o
,
đừng làm "${fnames[@]/.c%/.o}"
- nó sẽ không hoạt động. Làm
$ ls "${fnames[@]/%.c/.o}"
Nhưng đừng làm "${fnames[@]/.c/.o}"
(bỏ %
hoàn toàn) hoặc - nếu một trong những tên trong số đó là dog.catcher.c
, thì nó sẽ được chuyển đổi thành
(vì cái đầu tiên được thay thế bằng ).dog.oatcher.c
.c
.o
Thật không may, không có cách dễ dàng để thêm tiền tố và hậu tố, như bạn có thể làm với
$ ls 1.{foo,bar}.c
Xem tài liệu bash để biết thêm thông tin về các biến, mảng và các phép biến đổi bạn có thể áp dụng cho chúng.