5.7 Khai triển biểu thức
115
thường, trừ trường hợp, khi đứng sau nó (dấu gạch ngược) là một $, ‘, hay một
\. Nếu như sử dụng dạng $(command), thì tất cả các ký tự đứng trong ngoặc tạo
thành một câu lệnh, không có ký tự nào có ý nghĩa đặc biệt. Nếu phép thế câu
lệnh xảy ra phía trong ngoặc kép, thì trong kết quả của phép thế sẽ không thực
hiện phép phân chia từ và sự khai triển mẫu tên tập tin và thư mục.
5.7.5
Phép thế số học (Arithmetic Expansion)
Phép thế số học cho phép tính giá trị của một biểu thức số học và thay thế nó
(biểu thức) bởi kết quả thu được. Có hai dạng phép thế số học: $[expression]
((expression))
Trong đó expression được hiểu (được bash đọc) như khi
đứng trong ngoặc kép, nhưng những dấu ngoặc kép ở trong expression lại
được đọc như một ký tự thường. Phía trong expression có thực hiện các phép
thế tham biến và thế câu lệnh. Cú pháp của biểu thức expression tương tự như
cú pháp của biểu thức số học của ngôn ngữ C, cụ thể hơn về vấn đề này có thể đọc
trong phần ARITHMETIC EVALUATION của trang man của bash. Ví dụ, câu
lệnh
[user]$ echo $((2 + 3 * 5))
cho kết quả bằng “17”. Nếu biểu thức không chính xác, bash sẽ đưa ra thông báo
lỗi.
5.7.6
Phân chia từ (word splitting)
Sau khi thực hiện xong các phép thế tham biến, thế lệnh, và thế các biểu thức số
học, hệ vỏ lại phân tích dòng lệnh một lần nữa (nhưng ở dạng thu được sau các
phép thế nói trên) và thực hiện việc phân chia từ (word splitting). Thao tác này
nằm ở chỗ, hệ vỏ tìm trong dòng lệnh tất cả các ký tự phân chia, xác định bởi
biến IFS (xem trên), và nhờ đó chia nhỏ dòng lệnh thành các từ riêng rẽ trong
các chỗ tương ứng. Nếu giá trị của IFS bằng một dòng trống, thì việc phân chia
từ sẽ không xảy ra. Nếu trong dòng lệnh không thực hiện phép thế nào trong các
phép thế kể trên, thì phân chia từ cũng không xảy ra.
5.7.7
Khai triển các mẫu tên tập tin và thư mục (Pathname Expansion)
Phép thế tên đường dẫn và tập tin (Pathname expansion) sử dụng để chỉ nhờ
một mẫu nhỏ gọn mà có thể chỉ ra vài tập tin (hay thư mục), tương ứng với mẫu
này. Sau khi phân chia từ, và nếu như không đưa ra tùy chọn -f, thì bash sẽ tìm
kiếm trong từng từ của dòng lệnh các ký tự *, ?, và [. Nếu tìm thấy từ với một
hay vài ký tự như vậy, thì từ này sẽ được xem như một mẫu, và cần thay thế bởi
các từ trong danh sách đường dẫn, tương ứng với mẫu này. Nếu như không tìm
thấy tên tương ứng với mẫu, và biến nullglob không được đưa ra, thì từ sẽ không
thay đổi, tức là các ký tự đặc biệt bị mất giá trị và hiểu như các ký tự thường.
Nếu như biến này được xác định, mà đường dẫn tương ứng với mẫu không tìm
thấy, thì từ sẽ bị xóa khỏi dòng lệnh. Các ký tự dùng để tạo mẫu có các giá trị
trong bảng