Ngôn ngữ Linux shell scripting luôn là chủ đề hot và sẽ luôn là trong tương lai. Ngôn ngữ Shell Scripting thần kỳ và dễ dàng viết chương trình như ngôn ngữ khác. Tuy nhiên cần kiến thức sâu về điều mình làm và kết quả mong đợi.
Tất cả bài shell scripting chúng tôi viết cho độc giả được đánh giá cao bao gồm bài trước "Insight của Biến Linux". Chúng tôi mở rộng bài trước lên cấp độ mới.
Thuộc tính biến (Variable Attributes)
Mỗi biến trong môi trường Linux có tùy chọn, gọi là 'thuộc tính'. Các tùy chọn/thuộc tính này có thể bật On và tắt Off khi cần theo tình huống dùng lệnh "declare".
Ví dụ thuộc tính biến dùng switch '-i' bật thuộc tính integer cho biến tương ứng. Dù truyền giá trị non-numeric cho switch '-i' nó không ném lỗi mà ra '0' như diễn giải integer. Rõ ràng từ ví dụ dưới.
Khai báo biến Integer, bill = 121
admin@wsxdn.com:~$ declare -i bill=121
Printf giá trị biến bill.
admin@wsxdn.com:~$ printf "%d\n" "$bill" 121
Đặt giá trị biến là chuỗi. Biến bill đã khai báo, không cần khai báo lại. Chỉ đổi giá trị:
admin@wsxdn.com:~$ bill=tecmint
Lại printf giá trị biến bill.
admin@wsxdn.com:~$ printf "%d\n" "$bill" 0
Chú ý '0' thay vì thông báo lỗi.
Làm sao biết thuộc tính biến đã khai báo?
admin@wsxdn.com:~$ declare -p bill declare -i bill="121"
Ở đây, switch -p (print) đến giải cứu.
Lại, làm sao tắt thuộc tính biến?
Để tắt Off thuộc tính biến, chỉ cần dấu + (plus) ngay trước switch. Rõ ràng từ ví dụ:
Tắt thuộc tính integer cho biến trên.
admin@wsxdn.com:~$ declare +i bill
Kiểm tra giá trị biến.
admin@wsxdn.com:~$ printf "%d\n" "$bill" bash: printf: bill: invalid number 0
In giá trị biến dùng switch string.
admin@wsxdn.com:~$ printf "%s\n" "$bill" tecmint
Ở ví dụ trên, bash không đánh giá non-numeric là lỗi, tuy nhiên printf diễn giải gì có thể là số và gì không.
Biến Read-only (Read-only Variables)
Có nghe Read Only Memory (ROM), nhưng Biến Read-only là gì? Có giống ROM không?
Biến Read-only như Read-only Memory: giá trị không thay đổi sau khi gán. Do đó gọi Read-only. Không thể viết, sửa, gán giá trị mới. Minh họa:
Khai báo biến read only (-r) tên, giá trị "Tecmint.com".
admin@wsxdn.com:~$ declare -r name="Tecmint.com"
Printf giá trị biến trên.
admin@wsxdn.com:~$ printf "%s\n" "$name" Tecmint.com
Thử đổi giá trị biến.
admin@wsxdn.com:~$ declare -r name="Avishek" bash: declare: name: readonly variable
Như thảo luận, thuộc tính read-only variable có thể đổi dùng '+'.
Export biến trong Linux (Exporting Variables in Linux)
Tất cả biến shell khai báo trong script có hiệu lực khi script chạy. Bên ngoài script biến từ script không tồn tại. Quá trình làm biến có hiệu lực bên ngoài script gọi là export biến.
Biến có thể export ra khỏi shell dùng switch declare -x (export), xác nhận shell ý định export. Switch declare export dùng như:
admin@wsxdn.com:~$ declare -x variable="Constant_Value"
Mọi thay đổi biến khi script chạy, mất khi biến export ra khỏi script. Export biến rất quan trọng trong shell scripting.
Muốn biến read-only và có hiệu lực bên ngoài script, dùng switch -r và -x cùng lúc.
admin@wsxdn.com:~$ declare -rx variable="Constant_Value"
Biến môi trường (Environment Variables)
Biến chia sẻ giữa chương trình và chương trình thực thi chúng. Biến môi trường có thể export nhưng không gán thuộc tính.
Hiểu lý thuyết thực tế. Có 2 script 0.sh và 1.sh.
# 0.sh #!/bin/bash declare -rx name=Tecmint bash 0.sh exit 0
Script thứ hai:
# 1.sh #!/bin/bash printf "%s\n" "$name" name=Tecmint.com printf "%s\n" "$name" exit 0
Ở đây, biến (name) khai báo read only và export và ngay sau gọi script thứ hai.
Script thứ hai in biến từ script 1 đã export ở printf đầu. Ở printf thứ hai hiển thị giá trị mới gán cho biến 'name'.
Đừng lo biến read-only nhưng gán lại được. Nhớ không: "Mọi thay đổi biến khi script chạy, mất khi biến export ra khỏi script."
Tham khảo
Lệnh declare cho phép các switch dưới và tổ hợp:
- -a : Khai báo mảng.
- -f : Hiển thị Function và Định nghĩa.
- -F : Hiển thị Tên Function.
- -r : Khai báo biến read-only.
- -x : Khai báo biến Exportable.
- -I : Khai báo biến Integer.
Đó là tất cả. Bài tới sẽ thảo luận cách thay thế biến dùng 'eval' và biến đã định nghĩa trong bash trước khi kết thúc chủ đề. Hy vọng bạn tận hưởng hành trình đi sâu scripting. Cho đến lúc đó hãy theo dõi và kết nối Tecmint.com.