Chƣơng 6 LẬP TRÌNH SHELL VÀ LẬP TRÌN HC TRÊN LINUX
6.2. Một số lệnh lập trình trên shell
6.2.1. Sử dụng các toán tử bash
Các toán tử string
Các toán tử string, cũng đƣợc gọi là các toán tử thay thế trong tài liệu về bash, kiểm tra giá trị của biến là chƣa gán giá trị hoặc khộng xác định. Bảng dƣới là danh sách các toán tử này cùng với miêu tả cụ thể cho chức năng của từng toán tử.
Toán tử Chức năng
${var:- word} Nếu biến tồn tại và xác định thì trả về giá trị của nó, nếu khơng thì trả về word
${var:= word} Nếu biến tồn tại và xác định thì trả về giá trị của nó, nếu khơng thì gán biến thành word, sau đó trả về giá trị của nó ${var:+ word} Nếu biến tồn tại và xác định thì trả về word, cịn khơng
thì trả về null
${var:?message} Nếu biến tồn tại và xác định thì trả về giá trị của nó, cịn khơng thì hiển thị “bash: $var:$message” và thoát ra khỏi lệnh hay tập lệnh hiện thời.
${var: offset[:length]} Trả về một xâu con của var bắt đầu tại offset của độ dài length. Nếu length bị bỏ qua, toàn bộ xâu từ offset sẽ đƣợc trả về.
Các toán tử string của bash
Để minh hoạ, hãy xem xét một biến shell có tên là status đƣợc khởi tạo với giá trị defined. Sử dụng 4 toán tử string đầu tiên cho kết quả status nhƣ sau:
$echo ${status:-undefined} defined $echo ${status:=undefined} defined $echo ${status:+undefined} undefined
$echo ${status:?Dohhh\! undefined}
defined
Bây giờ sử dụng lệnh unset để xoá biến status, và thực hiện vẫn các lệnh đó, đƣợc output nhƣ sau:
- 66 - $unset status $echo ${status:-undefined} undefined $echo ${status:=undefined} undefined $echo ${status:+undefined} undefined $unset status
$echo ${status:?Dohhh\! undefined}
bash:status Dohhh! Undefined
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 tố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 tố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} Xố 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} Xố 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. Tố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. Tố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 tố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%/*}
- 67 -
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
${myfile##*/} = ide.txt basename $myfile = ide.txt
${myfile%/*} = /usr/src/linux/Documentation dirname $myfile = /usr/src/linux/Documentation
Để minh hoạ về các toán tử pattern-matching và thay thế, lệnh thay thế mỗi dấu hai chấm trong biến mơi trƣờng $PATH bằng một dịng mới, kết quả hiển thị đƣờng dẫn rất dễ đọc (ví dụ này sẽ sai nếu ta khơng có bash phiên bản 2.0 hoặc mới hơn):
$ echo –e ${PATH//:/\\n}
/usr/local/bin /bin /usr/bin /usr/X11R6/bin /home/kwall/bin /home/wall/wp/wpbin Các toán tử so sánh chuỗi str1 = str2 : str1 bằng str2 str1 != str2 : str1 khác str2
-n str : str có độ dài lớn hơn 0 (khác null) -z str : str có độ dài bằng 0 (null)
Các toán tử so sánh số học
-eq : bằng
-ge : lớn hơn hoặc bằng -gt : lớn hơn
-le : nhỏ hơn hoặc bằng -lt : nhỏ hơn
-ne : khác