Bài viết này là một phần của loạt bài hướng dẫn bash đang diễn ra. Giống như bất kỳ ngôn ngữ lập trình nào khác, Bash cũng cung cấp biến.
Biến Bash cung cấp bộ nhớ tạm thời cho thông tin sẽ cần trong vòng đời của chương trình.
Cú pháp:
VARNAME=VALUE
Lưu ý: Không nên có khoảng trắng quanh dấu = khi gán biến. Khi bạn dùng VAR=VALUE, shell thấy = như một ký hiệu và coi lệnh như gán biến. Khi bạn dùng VAR = VALUE, shell giả định VAR phải là tên một lệnh và cố gắng thực thi nó.
Shell không quan tâm kiểu biến. Biến có thể lưu chuỗi, số nguyên, hoặc số thực.
Ví Dụ 1. Gán Biến Bash Đơn Giản
Script sau tạo biến tên LIST và gán giá trị "/var/opt/bin". Để truy cập biến, chỉ cần thêm $ trước tên biến, nó sẽ cho giá trị lưu trong biến đó.
$ cat sample.sh #!/bin/bash LIST="/var/opt/bin/" ls -l $LIST
Thực thi script trên, nó sẽ liệt kê /var/opt/bin ở định dạng dài như dưới đây.
$ ./sample.sh total 8 drwxrwsr-x 2 bin bin 4096 Jan 29 06:43 softwares drwxr-sr-x 5 root bin 4096 Sep 2 2009 llist
Phạm Vi Biến Bash – Toàn Cục và Cục Bộ
Trong Bash, biến không cần khai báo. Nhưng, khi bạn truy cập biến chưa dùng bao giờ, bạn sẽ không nhận cảnh báo hay lỗi. Thay vào đó, nó hiển thị giá trị rỗng.
Ví Dụ 2. Giá Trị Rỗng Trong Biến Bash
$ cat var1.sh #!/bin/sh echo "Variable value is: $VAR1" VAR1="GEEKSTUFF" echo "Variable value is: $VAR1" $ ./var1.sh Variable value is: Variable value is: GEEKSTUFF
Như trên, ban đầu biến có giá trị rỗng, sau khi gán, bạn lấy được giá trị. Lệnh export dùng để xuất biến từ shell tương tác. Export thể hiện tác động lên phạm vi biến.
Ví Dụ 3. Biến Bash Không Có Export
Gán biến với giá trị trong shell tương tác, và thử truy cập cùng trong script shell.
$ VAR2=LINUX $ cat var2.sh #!/bin/bash echo "VAR2=$VAR2" VAR2=UNIX echo "VAR2=$VAR2"
Bây giờ, thực thi script trên như dưới đây.
$ ./var2.sh VAR2= VAR2=UNIX
Vẫn nhận giá trị rỗng cho biến VAR2. Shell lưu biến VAR2 với LINUX chỉ trong shell hiện tại. Khi thực thi var2.sh, nó sinh ra shell và thực thi script. Vì vậy biến VAR2 không có giá trị trong shell con. Bạn cần export biến để nó được kế thừa bởi chương trình khác – bao gồm script shell, như dưới đây.
Ví Dụ 4. Xuất Biến Bash (Export)
$ export VAR2=LINUX $ cat var2.sh #!/bin/bash echo "VAR2=$VAR2" VAR2=UNIX echo "VAR2=$VAR2"
Bây giờ thực thi script trên.
$ ./var2.sh VAR2=LINUX VAR2=UNIX $ $echo $VAR2 LINUX
Bây giờ, bạn nhận thấy sau khi thực thi script shell var2.sh, giá trị VAR2 là LINUX. Bởi vì biến không được truyền ngược về shell tương tác của bạn, trừ khi bạn thực thi script trong shell hiện tại.
Khai Báo Biến Bash
Sử dụng câu lệnh declare trong bash, chúng ta có thể giới hạn giá trị gán cho biến. Nó hạn chế thuộc tính của biến. Tùy chọn trong câu lệnh declare dùng để xác định kiểu biến.
Cú pháp:
declare option variablename
declarelà từ khóa- tùy chọn có thể:
-rbiến chỉ đọc-ibiến số nguyên-abiến mảng-fcho hàm-xkhai báo và export cho các lệnh tiếp theo qua môi trường.
Ví Dụ 5. Khai Báo Biến Bash Sử Dụng Declare
$ cat declar.sh #!/bin/bash declare -i intvar intvar=123 # Gán giá trị số nguyên. echo $intvar intvar=12.3 # Thử lưu kiểu chuỗi vào biến số nguyên echo $intvar declare -r rovar=281 rovar=212 # Thử thay đổi biến chỉ đọc.
Từ thực thi dưới, bạn nhận thấy thông báo lỗi khi gán dữ liệu không hợp lệ cho biến.
$ ./declar.sh 123 t.sh: line 6: 12.3: syntax error: invalid arithmetic operator (error token is ".3") 123 t.sh: line 11: rovar: readonly variable
Biến Toàn Cục Bash
Biến toàn cục còn gọi là biến môi trường, sẽ có sẵn cho tất cả shell. Lệnh printenv dùng để hiển thị tất cả biến môi trường.
$ printenv SHELL=/bin/bash HISTSIZE=1000 SSH_TTY=/dev/pts/1 HOME=/root LOGNAME=root CVS_RSH=ssh
Biến Cục Bộ Bash
Biến cục bộ chỉ nhìn thấy trong khối mã. local là từ khóa dùng để khai báo biến cục bộ. Trong một hàm, biến cục bộ chỉ có ý nghĩa trong khối hàm đó.
Ví Dụ 6. Biến Toàn Cục và Cục Bộ Bash
$ cat localvar.sh
#!/bin/bash
pprint() {
local lvar="Local content"
echo -e "Local variable value with in the function"
echo $lvar
gvar="Global content changed"
echo -e "Global variable value with in the function"
echo $gvar
}
gvar="Global content"
echo -e "Global variable value before calling function"
echo $gvar
echo -e "Local variable value before calling function"
echo $lvar
pprint
echo -e "Global variable value after calling function"
echo $gvar
echo -e "Local variable value after calling function"
echo $lvar
Thực thi script trên,
$ sh t.sh Global variable value before calling function Global content Local variable value before calling function Local variable value with in the function Local content Global variable value with in the function Global content changed Global variable value after calling function Global content changed Local variable value after calling function
Trong đầu ra trên, biến cục bộ chỉ có giá trị rỗng trước và sau khi gọi hàm. Phạm vi chỉ trong hàm. Nó biến mất ngoài hàm, trong khi biến toàn cục có giá trị cập nhật ngay cả sau khi thực thi hàm.