1
3
Cần thiết unset status lần thứ hai vì ở lệnh thứ ba, echo ${status:+undefined}, khởi tạo
lại status thành undefined.
Các toán tử substring đã có trong danh sách ở bảng trên đặc biệt có ích. Hãy xét biến
foo có giá trị Bilbo_the_Hobbit. Biểu thức ${foo:7} trả về he_Hobbit, trong khi ${foo:7:5}
lại trả về he_Ho.
Các toán tử Pattern-Matching
Các toán tử pattern-matching có ích nhất trong công việc với các bản ghi độ dài biến
hay các xâu đã được định dạng tự do được định giới bởi các kí tự cố định. Biến môi trường
$PATH là một ví dụ. Mặc dù nó có thể khá dài, các thư mục riêng biệt được phân định bởi
dấu hai chấm. Bảng dưới là danh sách các toán tử Pattern-Matching của bash và chức năng
của chúng.
Toán tử
Chức năng
${var#pattern}
Xoá bỏ phần khớp (match) ngắn nhất của pattern trước var
và trả về phần còn lại
${var##pattern}
Xoá bỏ phần khớp (match) dài nhất của pattern trước var và
trả về phần còn lại
${var%pattern}
Xoá bỏ phần khớp ngắn nhất của pattern ở cuối var và trả
về phần còn lại
${var%%pattern}
Xoá bỏ phần khớp dài nhất của pattern ở cuối var và trả về
phần còn lại
${var/pattern/string}
Thay phần khớp dài nhất của pattern trong var bằng string.
Chỉ thay phần khớp đầu tiên. Toán tử này chỉ có trong bash
2.0 hay lớn hơn.
${var//pattern/string}
Thay phần khớp dài nhất của pattern trong var bằng string.
Thay tất cả các phần khớp. Toán tử này có trong bash 2.0
hoặc lớn hơn.
Các toán tử bash Pattern-Matching
Thông thường quy tắc chuẩn của các toán tử bash pattern-matching là thao tác với file
và tên đường dẫn. Ví dụ, giả sử ta có một tên biến shell là mylife có giá trị là
/usr/src/linux/Documentation/ide.txt (tài liệu về trình điều khiển đĩa IDE của nhân). Sử
dụng mẫu “/*” và “*/” ta có thể tách được tên thư mục và tên file.
#!/bin/bash
############################################
myfile=/usr/src/linux/Documentation/ide.txt
echo ‘${myfile##*/}=’ ${myfile##*/}
echo ‘basename $myfile =’ $(basename $myfile)
echo ‘${myfile%/*}=’ ${myfile%/*}
echo ‘dirname $myfile =’ $(dirname $myfile)
Lệnh thứ 2 xoá xâu matching “*/” dài nhất trong tên file và trả về tên file. Lệnh thứ 4
làm khớp tất cả mọi thứ sau “/”, bắt đầu từ cuối biến, bỏ tên file và trả về đường dẫn của
file. Kết quả của tập lệnh này là:
$ ./pattern.sh