Chúng tôi đã viết một loạt bài về Lập trình Shell Linux được đón nhận rất nhiệt huyết và vẫn rất có giá trị cho đến ngày nay. Dưới đây là đường dẫn đến bộ sưu tập các bài viết về shell scripting.
- Học Lập Trình Shell Linux
Trong bài viết này, chúng ta sẽ tìm hiểu về biến, cách thực thi và triển khai chúng trong script shell.
Lưu Trữ Đầu Ra
Đầu ra của một lệnh có thể được chuyển hướng ra đầu ra chuẩn hoặc một tệp, cũng có thể lưu trữ trong một biến. Nếu đầu ra của lệnh quá lớn để hiển thị trên màn hình, ta chỉ còn tùy chọn lưu vào tệp hoặc biến. Ưu điểm của việc lưu vào biến là tốc độ kiểm tra nhanh hơn. Biến được lưu trong bộ nhớ nên truy xuất nhanh hơn so với đọc từ tệp.
Biến Trong Ngôn Ngữ Scripting
Biến là thành phần quan trọng trong shell scripting, được khai báo bằng lệnh bash declare. Để khai báo biến tên level, ta thực hiện lệnh sau:
$ declare LEVEL
Lưu ý: Cần dùng typecast, một câu lệnh tích hợp để tương thích với korn shell. Lệnh declare tiên tiến hơn, có đầy đủ tính năng, nên khuyến nghị dùng khi làm việc với BASH.
Quy Tắc
- Tên biến phải phản ánh mục đích sử dụng trong script.
- Nên dùng chung một tên biến xuyên suốt chương trình.
- Tên biến có thể viết hoa hoặc thường, nhưng theo quy ước các lệnh shell viết thường, nên dùng chữ HOA cho biến để tránh nhầm lẫn. Ví dụ: TOTAL_BILLED_AMOUNT, SELL_REPORT, ORDER_RECEIPT, v.v.
Triển Khai
Gán giá trị cho biến bằng dấu bằng (=). Để gán chuỗi rỗng, không cung cấp giá trị sau dấu bằng.
$ LEVEL =
Kiểm tra giá trị lưu trong biến LEVEL:
$ printf "%i" $LEVEL
Lệnh printf (quen thuộc với lập trình viên C) in dữ liệu. %i đại diện cho số nguyên. Có thể thay bằng %c cho ký tự hoặc %s cho chuỗi khi cần.
$LEVEL: Dấu $ hoạt động như bộ thay thế giá trị cho biến LEVEL.
Kết Quả Mẫu
$ printf "%i" $LEVEL 0
Gán giá trị cho biến.
$ LEVEL=0
Kiểm tra dữ liệu đã lưu.
$ printf "%i" $LEVEL 0
LƯU Ý: Thú vị thay cả hai trường hợp (chưa gán giá trị và gán giá trị 0) đều cho kết quả 0. Tuy kết quả giống nhau nhưng shell xử lý khác nhau.
Gán giá trị mới.
$ LEVEL=121
Kiểm tra lại.
$ printf "%i" $LEVEL 121
Hủy Biến
Declare là lệnh BASH, tạo biến khi thực thi. Biến tồn tại trong bộ nhớ cho đến khi script dừng hoặc bị hủy.
$ unset LEVEL
Các Biến Định Nghĩa Sẵn Trong BASH
BASH có hơn 50 biến định nghĩa sẵn. Một số có ý nghĩa đặc biệt, ví dụ RANDOM sinh số ngẫu nhiên. Nếu unset rồi định nghĩa lại, giá trị gốc mất vĩnh viễn. Nên tránh dùng tên biến hệ thống.
Dưới đây là một số biến BASH hữu ích:
- BASH – Đường dẫn đầy đủ của Bash.
- BASH_ENV – Tên tệp profile thực thi trước khi script bắt đầu.
- BASH_VERSION – Phiên bản Bash (ví dụ: 2.04.0(1)-release).
- COLUMNS – Số ký tự mỗi dòng trên màn hình (ví dụ: 80).
- HOSTNAME – Tên máy tính. Có thể là tên máy hoặc tên miền đầy đủ.
- HOSTTYPE – Loại máy tính.
- HOME – Thư mục home của bạn.
- OSTYPE – Tên hệ điều hành.
- PATH – Danh sách đường dẫn tìm kiếm lệnh, cách nhau bởi dấu hai chấm.
- PPID – Process ID của tiến trình cha của shell.
- PROMPT_COMMAND – Lệnh thực thi trước khi đặt chuỗi prompt chính PS1.
- PWD – Thư mục làm việc hiện tại (do lệnh cd đặt).
- RANDOM – Trả về số ngẫu nhiên 0 đến 32767 mỗi lần tham chiếu.
- SHELL – Shell ưu tiên dùng; cho các chương trình khởi động shell.
- TERM – Loại giả lập terminal (ví dụ: console).
Quy tắc tách từ (Word Splitting).
$ LEVEL=0 $ printf "%i" $LEVEL 0 AND $ LEVEL="0" $ printf "%i" $LEVEL 0
Cả hai cho kết quả giống nhau. Vậy sự khác biệt khi dùng dấu ngoặc kép là gì?
Thử với dữ liệu biến khác:
$ LEVEL=0 ; 1 ; 2 ; 3 ; 4 ; 5 bash: 1: command not found bash: 2: command not found bash: 3: command not found bash: 4: command not found bash: 5: command not found
$ printf "%i" $LEVEL 0
Kết quả không chính xác. BASH coi khoảng trắng sau 0 là dấu kết thúc, nên giá trị biến chỉ là 0. Thử dùng ngoặc kép:
$ LEVEL="0 ; 1 ; 2 ; 3 ; 4 ; 5" $ printf "%s" $LEVEL 0;1;2;3;4;5
Vẫn chưa đúng. BASH lấy giá trị biến và xóa tất cả khoảng trắng giữa chúng. Do đó printf không hiểu 0,1,2,3,4,5 là các giá trị riêng biệt. Giải pháp?
printf "%s" "$LEVEL" 0 ; 1 ; 2 ; 3 ; 4 ; 5
Đúng rồi! Đặt thay thế biến trong ngoặc kép là giải pháp. Ngoặc kép nhóm các ký tự trong shell và diễn giải ký tự đặc biệt có ý nghĩa.
Ngoặc kép có thể dùng liên tiếp và nên bao quanh các thay thế biến. Cũng dùng để tách văn bản tổng thể khỏi các phần trong ngoặc. Ví dụ:
$ LEVEL=5 $ FLAG_MESSAGE="I HAVE CLEARED LEVEL""$LEVEL"". I Deserve appreciation." $ printf "%s" "$FLAG_MESSAGE"
"I HAVE CLEARED LEVEL5. I Deserve appreciation."
Tách các đoạn văn bản trong ngoặc bằng khoảng trắng sẽ gây vấn đề tương tự. BASH coi khoảng trắng là dấu kết thúc. Cách khác thay thế biến:
$ LEVEL=5
$ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
$ printf "%s" "$FLAG_MESSAGE"
"I HAVE CLEARED LEVEL 5. I Deserve appreciation."
Ngoặc đơn ngăn BASH in ký tự đặc biệt.
$ printf "%s" '$FLAG_MESSAGE' "$FLAG_MESSAGE"
Dấu Gạch Chéo Ngược (\)
Dấu gạch chéo ngược hoạt động như ngoặc đơn cho một ký tự. Bạn nghĩ sao để in (")?
$ printf "%c" "\""
Khi %q kết hợp với printf, thêm gạch chéo ngược sau mỗi từ để đảm bảo khoảng trắng từ.
$ LEVEL=5
$ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
$ printf "%q" "$FLAG_MESSAGE"
"I\ HAVE\ CLEARED\ LEVEL\ 5.\ I\ Deserve\ appreciation."
Tạm kết phần này. Chúng tôi luôn cố gắng cung cấp bài viết hữu ích. Chủ đề biến rất rộng, phần còn lại về Thuộc tính biến, Xuất biến sẽ có trong bài tiếp theo.
Hãy theo dõi và kết nối với Tecmint.com. Đừng quên để lại phản hồi quý báu ở phần bình luận bên dưới.