Hai bài trước về BASH Shell thảo luận biến chi tiết được độc giả đánh giá cao. Chúng tôi Tecmint-Team rất mong cung cấp chủ đề mới nhất, cập nhật và liên quan chi tiết. Luôn cố gắng chạm đến các góc độ chính của chủ đề.
Đây là bài cuối về biến Linux, xem thay thế biến và biến định nghĩa sẵn trong Shell trước khi kết thúc chủ đề.
Bash thực hiện thay thế biến trước khi lệnh thực sự chạy. Linux Bash Shell tìm tất cả dấu '$' trước khi thực thi lệnh và thay bằng giá trị biến. Quá trình thay thế biến Bash chỉ diễn ra một lần. Làm sao nếu có biến lồng nhau?
Lưu ý: Biến lồng nhau nghĩa là biến khai báo bên trong biến. Xem kịch bản dưới đây.
Khai báo biến Read-Only và Executable:
admin@wsxdn.com:~$ declare -rx Linux_best_website="www.tecmint.com"
Kiểm tra giá trị biến:
admin@wsxdn.com:~$ printf "%s" "$Linux_best_website" www.tecmint.com
Khai báo biến khác cũng Read-Only và Executable:
admin@wsxdn.com:~$ declare -rx Linux_website="Linux_best_website"
Bây giờ có 2 biến:
'Linux_best_website', giá trị "www.tecmint.com"
'Linux_website', giá trị "Linux_best_website"
Kết quả chạy lệnh một dòng dưới?
admin@wsxdn.com:~$ printf "%s" "$Linux_website"
Nên thay '$Linux_website' bằng "Linux_best_website" rồi "$Linux_best_website" lại là biến giá trị "www.tecmint.com". Kết quả cuối nên là:
admin@wsxdn.com:~$ printf "%s" "$Linux_website" www.tecmint.com
Nhưng thực tế không phải, đầu ra là Linux_best_website.
Lý do? Bash thay thế giá trị biến chỉ một lần. Làm sao với script phức tạp cần thay thế biến thường xuyên và nhiều lần?
Đây là lúc lệnh 'eval' xuất hiện, thực hiện thay thế biến thêm lần trong script. Ví dụ làm rõ:
Khai báo biến x giá trị 10.
admin@wsxdn.com:~/Desktop$ declare x=10
Kiểm tra giá trị x:
admin@wsxdn.com:~/Desktop$ echo $yx x10
Khai báo biến y giá trị x.
admin@wsxdn.com:~/Desktop$ declare y=x
Kiểm tra giá trị y:
admin@wsxdn.com:~/Desktop$ echo $y x
Vấn đề BASH thay thế biến một lần, không thực hiện vòng thay thế thêm. Dùng 'eval' khắc phục.
admin@wsxdn.com:~/Desktop$ eval y=$x
Kiểm tra giá trị 'y':
admin@wsxdn.com:~/Desktop$ echo $y 10
Hurrah! Vấn đề giải quyết và 'eval' thắng cuộc :)
Không cần nói, 'eval' rất hữu ích trong script lớn và công cụ tiện lợi.
Phần cuối quan trọng không kém là biến BASH định nghĩa sẵn. Đừng hoảng nhìn danh sách dài. Không cần nhớ toàn bộ trước khi viết script trừ vài cái. Là một phần quá trình học, trình danh sách biến BASH định nghĩa sẵn.
| STT | BIẾN BASH | KẾT QUẢ |
|---|---|---|
| 1 | auto_resume | Hoàn thành lệnh cho job dừng. |
| 2 | BASH | Đường dẫn shell. |
| 3 | BASH_ENV | Hiển thị tên file profile. |
| 4 | BASH_VERSION | Hiển thị phiên bản Bash. |
| 5 | BASH_VERSINFO | Hiển thị thông tin phiên bản chi tiết. |
| 6 | BASH_VERSINFO[0] | Số phiên bản chính (release). |
| 7 | BASH_VERSINFO[1] | Số phiên bản phụ (version). |
| 8 | BASH_VERSINFO[2] | Mức vá (patch level). |
| 9 | BASH_VERSINFO[3] | Phiên bản build. |
| 10 | BASH_VERSINFO[4] | Trạng thái release (ví dụ beta1). |
| 11 | BASH_VERSINFO[5] | Giá trị MACHTYPE. |
| 12 | CDPATH | Danh sách thư mục cách nhau bởi dấu hai chấm. |
| 13 | COLUMNS | Số ký tự mỗi dòng trên Standard Output. |
| 14 | EUID | User ID của user hiện tại. |
| 15 | FCEDIT | Trình soạn thảo mặc định cho lệnh fc. |
| 16 | FUNCNAME | Tên của hàm |
| 17 | GROUPS | Nhóm mà user là thành viên. |
| 18 | HISTFILE | File chứa lịch sử lệnh. |
| 19 | HOME | Tên thư mục home của bạn. |
| 20 | LINES | Số dòng ngang trên Standard Output. |
| 21 | Tên file kiểm tra thư đến. | |
| 22 | OSTYPE | Tên hệ điều hành. |
| 23 | OLDPWD | Thư mục làm việc trước đó. |
| 24 | PWD | Thư mục làm việc hiện tại. |
| 25 | RANDOM | In số ngẫu nhiên. |
| 26 | SHELL | Shell ưu tiên dùng. |
| 27 | TIMEFORMAT | Định dạng cho lệnh time. |
| 28 | UID | ID của user hiện tại. |
Có danh sách lớn biến BASH định nghĩa sẵn. Đã cố gắng liệt kê thường dùng nhất.
Đó là tất cả. Sẽ quay lại bài thú vị khác. Cho đến lúc đó hãy theo dõi và kết nối TecMint. Đừng quên góp ý quý báu ở phần bình luận dưới.