Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux/Bài 2
Loạt bài "Các Lược Giảng Chuyên Sâu về Sử Dụng Văn Lệnh BASH trong Linux" của tác giả Làng Đậu giữ bản quyền 2006. Người đọc chỉ được sử dụng cho mụch đích học tập hay giảng dạy cho cá nhân. Cấm mọi hình thức sao chép, đăng lại, hay in lại nhằm mụch đích mua bán hay trục lợi mà không có sự cho phép chính thức của tác giả. Mọi thông tin về việc phổ biến rộng rãi có tính quảng bá tài liệu này cho mụch đích giáo dục hay các phê bình, đề nghị về nội dung bài giảng xin liên lạc về vo_quang_nhan@yahoo.com
Bài 2 - Đơn vị của ngôn ngữ: Biến, Truy cập điều chỉnh nội dung đặc điểm của biến
Mục lục
- 1 Biến, tham số, và quy tắt đặt tên biến
-
2
Biểu
thức
giá
trị
mặc
định
- 2.1 ${[TÊN_BIẾN]:-[Giá_Trị_Mặc_Định]}
- 2.2 ${[TÊN_BIẾN]-[Giá_Trị_Mặc_Định]}
- 2.3 ${[TÊN_BIẾN]:=[Giá_Trị_Mặc_Định]}
- 2.4 ${[TÊN_BIẾN]=[Giá_Trị_Mặc_Định]}
- 2.5 ${[TÊN_BIẾN]:+[Giá_Trị_Mặc_Định]}
- 2.6 ${[TÊN_BIẾN]+[Giá_Trị_Mặc_Định]}
- 2.7 ${[TÊN_BIẾN]:?[Giá_Trị_Mặc_Định]}
- 2.8 ${[TÊN_BIẾN]?[Giá_Trị_Mặc_Định]}
- 2.9 Thí dụ
-
3
Truy
cập
có
điều
chỉnh
giá
trị
của
một
biến
- 3.1 ${[TÊN_BIẾN]#[Dạng_Thức]}
- 3.2 ${[TÊN_BIẾN]##[Dạng_Thức]}
- 3.3 ${[TÊN_BIẾN]%[Dạng_Thức]}
- 3.4 ${[TÊN_BIẾN]%%[Dạng_Thức]}
- 3.5 ${[TÊN_BIẾN]:[Vị_Trí]}
- 3.6 ${[TÊN_BIẾN]:[Vị_Trí]:[Độ_dài]}
- 3.7 ${[TÊN_BIẾN]/[Dạng_Thức]/[Chuỗi_Kí_tự_Thay_Thế]}
- 3.8 ${[TÊN_BIẾN]//[Dạng_Thức]/[Chuỗi_Kí_tự_Thay_Thế]}
- 3.9 Thí dụ
- 4 Truy cập các đặc tính khác của biến
- 5 Biểu thị nội dung string
- 6 Chuỗi kí tự với dấu huyền `[Mệnh_Lệnh]` hay ngoặc đơn $([Mệnh_Lệnh])
- 7 Sử dụng kí tự thoát
Biến, tham số, và quy tắt đặt tên biến[sửa]
Đối với BASH không có sự phân biệt nào giữa một biến và một tham số. Việc phân biệt này hoàn toàn tùy thuộc vào người lập trình tự quy ước lấy. Do đó, khi nói về biến tức là nói về tham số. Như các ngôn ngữ lập trình khác, biến và tham số là một phận rất quan trọng của ngôn ngữ BASH. Trong Linux/UNIX có hai loại: biến địa phương (local variable) và biến môi trường (environment variable).
Các biến môi trường[sửa]
Là biến truy cập được cho tất cả các tiến trình con tạo ra từ hệ vỏ ở thời điểm mà chúng đưọc định nghiã. Nhiều biến môi trường được tạo ra ngay trong các văn lệnh khởi động và được cài để trở thành biến toàn cục (global varibable). Để thông báo một biến là biến môi trường thì phải dùng lệnh có cú pháp là một trong các dạng:
export [TÊN_BIẾN]
export [TÊN_BIẾN]
=[Giá_trị_gán_cho_TÊN_BIẾN]
Hay là:
declare -x [TÊN_BIẾN]
declare -x [TÊN_BIẾN]
=[Giá_trị_gán_cho_TÊN_BIẾN]
Một khi đã khai báo như trên thì tất cả các tiến trình con (child process) đều có thể truy cập tới biến này.
Các biến địa phương[sửa]
Các
biến
không
phải
là
biến
môi
trường
đều
là
biến
địa
phương.
Các
biến
địa
phương
chỉ
có
giá
trị
và
có
hiệu
lực
trong
văn
lệnh
hay
trình
bao
mà
nó
được
khai
báo
lần
đầu
và
được
trình
bao
công
nhận
ngay
sau
khi
chúng
được
khai
báo.
Khác
với
C/C++
các
biến
trong
một
chương
trình
BASH
không
có
tính
cục
bộ
(nghiã
là
cho
dù
1
biến
được
khai
báo
bên
trong
1
hàm
hay
trong
một
vòng
lặp
thì
chúng
đều
có
hiệu
lực
sử
dụng
trong
toàn
văn
lệnh
kể
từ
khi
chúng
được
khai
báo
và
có
thể
tiếp
tục
sử
dụng
mặc
dù
chúng
được
truy
cập
bên
ngoài
hàm
hay
vòng
lặp
đã
khai
báo
tạo
ra
chúng.
Khác
với
các
biến
môi
trường
có
tính
toàn
cục,
các
biến
địa
phương
sẽ
không
có
hiệu
lực
cho
các
tiến
trình
con
(chẳng
hạn
như
là
khi
gọi
các
văn
lệnh
con)
và
hết
hiệu
lực
ngay
khi
văn
lệnh
đó
kết
thúc
(Ngoại
trừ
có
khai
báo
đặc
biệt
như
là
khai
báo
bao
hàm
một
tập
tin
qua
lệnh
. [Tên_Tập
_Tin]
hay
khai
báo
biến
toàn
cục
qua
lệnh
export
)
Quy tắc chung khi đặt tên biến[sửa]
Tên biến trong BASH có thể là bất kì nhưng cần chú ý một số giới hạn sau:
- Tên biến chỉ có thể bắt đầu chữ cái trong bảng kí tự Anh ngữ (từ A-Z hay từ a-z) hay kí tự gạch dưới '_'
- Các kí tự bên trong tên của một biến có thể là các chữ cái trong bảng kí tự Anh ngữ, các chữ số, hay là kí tự gạch dưới '_'. Mọi kí tự khác với quy định này sẽ xem như là một đánh dấu kết thúc của tên một biến.
Lưu ý: Như C/C++, tên biến trong BASH có tính nhạy cảm (sensitive) với chữ viết hoa và chữ viết thường (nghiã là biến có tên myVar sẽ hoàn toàn khác với biến tên là myvar). Ngoài ra, BASH là ngôn ngữ có kiểu yếu, tức là người lập trình không cần (hay không nhất thiết) phải khai báo kiểu của một biến. Cũng không có sự khác nhau đặc biệt gì để phân biệt một biến và một tham số trong sử dụng
Khai báo[sửa]
Có hai cách thức chính để khai báo một biến
Khai báo dơn giản và gán giá trị ban đầu (nếu muốn)[sửa]
Thí dụ:
myInt=23 myReal=1.2 myString="Hello BASH world" myNullValue=
Lưu ý:
- Trong thí dụ trên khi gán giá trị ban đầu cho biến thì không được để khoảng trống (space) ở giữa toán tử dấu bằng (=) với hai vế.
-
Nếu
liền
sau
toán
tử
dấu
bằng
(=)
mà
không
có
giá
trị
nào
thì
BASH
sẽ
mặc
định
và
gán
cho
nó
giá
trị
null
(tứ
là
một
kiểu
string
độ dài bằng 0). - Người lập trình hoàn toàn có quyền không khai báo trước mà chỉ sử dụng tên biến, ngay lập tức trình thông dịch tìm thấy tên hợp lệ trong một biểu thức thì sẽ mặc định đó là tên biến.
Khai báo biến có kiểu hay có điều kiện[sửa]
-
Từ
khoá
declare
haytypeset
có thể được dùng để chỉ định kiểu cho một biến. Nó cho phép giới hạn các đặc tính của một biến. Các khai báo có kiểu hoàn toàn không thay đổi nếu thaydeclare
bởitypeset
Lưu
ý:
Tất
cả
các
biến
đã
được
dùng
lệnh
declare
hay
typeset
ngoại
trừ
là
biến
hằng,
đều
có
thể
hủy
bỏ
hiệu
lực
của
của
chúng
bằng
lệnh
unset [TÊN_BIẾN]
.
Khi
đó,
các
giá
trị
cài
đặt
lên
các
biến
đã
hủy
hiệu
lực
sẽ
là
null
.
Khai báo biến có kiểu mảng (array)[sửa]
Cú pháp:
typeset -a [TÊN_BIẾN]
hay
typeset -a [TÊN_BIẾN]
=([GIÁ_TRỊ1]
,[GIÁ_TRỊ2]
,[GIÁ_TRỊ3]
,...)
Thí dụ:
#declare myArray as an array and assign the initial values for that array declare -a myArray=("apple" "banana" "chili" "mango") myArray[4]="lime" #traversal to all of the elements of myArray echo ${myArray[*]} #get only one element echo ${myArray[2]}
Đoạn văn lệnh trên sẽ trả về các dòng:
# apple banana chili mango lime # chili
Khai báo tên hàm[sửa]
Cú pháp:
declare -f [TÊN_HÀM]
Thí dụ:
typeset -f myFunc #implelement myFunc myFunc () { echo "inside myFunc" } #listing all code of all functions declare -f #invoke myFunc myFunc
Khai báo biến có kiểu nguyên (integer)[sửa]
Cú
pháp:
declare
-i [TÊN_BIẾN]
hay
declare -i [TÊN_BIẾN]
=[GIÁ_TRỊ]
Khai báo biến là một hằng[sửa]
Cú pháp:
typeset -r [TÊN_BIẾN]
hay
typeset -r [TÊN_BIẾN]
=[GIÁ_TRỊ_HẰNG]
r là chữ viết tắt từ "read-only" nghiã là "chỉ được đọc"
Khai báo biến là biến môi trường[sửa]
Cú pháp:
declare -x [TÊN_BIẾN]
hay
declare
-x [TÊN_BIẾN]
=[GIÁ_TRỊ]
Lưu
ý:
Ngoài
ra,
lệnh
declare
hay
typeset
còn
hỗ
trợ
một
chức
năng
nữa
là
typeset
-F
.
Khi
gọi
lệnh
này
thì
chỉ
có
tên
của
các
hàm
sẽ
được
kiệt
kê.
Thí dụ[sửa]
#!/bin/bash func1 () { echo "This is funct1." } func2 () { echo "This is funct2." } echo "Declare -f without argument:" declare -f # Lists the function above. echo "Line declare -f with argument:" typeset -f func1 declare -i var # var1 is an integer. var=123 echo "var declared as $var" var=var+1 # Integer declaration and no need for using of 'let' command. " echo "var is increased by 1: $var" echo "Attempting to change var to floating point value, 23.4." var=23.4 # Error message and no change happened. echo "var is still $var" declare -r pi=3.1416 # set pi as constant and assign a value. echo "pi declared as $pi" # Attempt to change read-only variable. pi=3.141592 # Generates error message, and exit from script. echo "pi is still $pi" # This line will not execute. exit 0
Giá trị (hay nội dung) của một biến[sửa]
$ [TÊN_BIẾN]
là
biểu
thức
giá
trị
của
biến
[TÊN_BIẾN]
.
Thực
chất
đây
chỉ
là
cách
viết
gọn
của
dạng
chính
tắc
là
${
[TÊN_BIẾN]
}
nếu
như
không
có
sự
nhầm
lẫn.
Lưu
ý:
Trong
mọi
trường
hợp
tổng
quát
để
trình
dịch
không
bị
hiểu
sai
thì
dạng
chính
tắc
biểu
thị
giá
trị
của
1
biến
(
tức
là
viết
dưới
dạng
${
[TÊN_BIẾN]
}
)
nên
được
sử
dụng
Thí dụ1:
myInt=33 echo "the value of myInt is $myInt"
Thí dụ2:
#file: confusing #!/bin/bash T="file_" T1="message_" T2="to_you_" echo "$T1$T2 cannot be ${T}1 ${T}2" # display as 'message_to_you_ cannot be file_1file_2'
Biểu thức giá trị mặc định[sửa]
Trong nhiều trường hợp gía trị của một biến có thể chưa được xác lập hay tên chưa được định nghiã thì người ta có thể trả về một giá trị mặc định. Sau đây là các biểu thức trả về giá trị mặc định mà BASH hỗ trợ:
${
[TÊN_BIẾN]
:-[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
đã
hết
hiệu
lực
(bằng
lệnh
unset
hay
chưa
được
khai
báo
)
hay
có
giá
trị
null
thì
giá
trị
[Giá_Trị_Mặc_Định]
được
trả
về.
Ngoài
trường
hợp
này
ra,
giá
trị
của
[TÊN_BIẾN]
sẽ
được
trả
về.
Giữ
nguyên
hiện
trạng
của
biến
[TÊN_BIẾN]
trong
mọi
trường
hợp.
${
[TÊN_BIẾN]
-[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
chưa
được
khai
báo
thì
giá
trị
[Giá_Trị_Mặc_Định]
được
trả
về.
Ngoài
trường
hợp
này
ra,
giá
trị
của
[TÊN_BIẾN]
sẽ
được
trả
về.
Giữ
nguyên
hiện
trạng
của
[TÊN_BIẾN]
trong
mọi
trường
hợp.
${
[TÊN_BIẾN]
:=[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
đã
hết
hiệu
lực
(bằng
lệnh
unset
hay
chưa
được
khai
báo
)
hay
có
giá
trị
null
thì
<Giá_Trị_Mặc_Định>
được
trả
về
đồng
thời
biến
[TÊN_BIẾN]
cũng
được
định
nghiã
(nếu
nó
chưa
được
khai
báo)
và
được
gán
giá
trị
<Giá_Trị_Mặc_Định>.
${
[TÊN_BIẾN]
=[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
chưa
được
khai
báo
thì
giá
trị
<Giá_Trị_Mặc_Định>
được
trả
về,
đồng
thời
biến
[TÊN_BIẾN]
cũng
được
định
nghiã
và
được
gán
giá
trị
[Giá_Trị_Mặc_Định]
.
Ngoài
trường
hợp
này
ra,
giá
trị
[TÊN_BIẾN]
được
trả
về
và
giữ
nguyên
hiện
trạng
của
[TÊN_BIẾN]
${
[TÊN_BIẾN]
:+[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
đã
khai
báo
và
khác
null
thì
giá
trị
[Giá_Trị_Mặc_Định]
được
trả
về.
Ngoài
trường
hợp
này
ra,
giá
trị
null
được
trả
về.
Giữ
nguyên
hiện
trạng
của
[TÊN_BIẾN]
trong
mọi
trường
hợp.
${
[TÊN_BIẾN]
+[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
đã
khai
báo
thì
giá
trị
[Giá_Trị_Mặc_Định]
được
trả
về.
Ngoài
trường
hợp
này
ra,
giá
trị
của
null
được
trả
về.
Giữ
nguyên
hiện
trạng
của
[TÊN_BIẾN]
trong
mọi
trường
hợp.
${
[TÊN_BIẾN]
:?[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
đã
khai
báo
và
khác
null
thì
giá
trị
biến
[TÊN_BIẾN]
được
trả
về.
Ngoài
trường
hợp
này
ra,
giá
trị
của
[Giá_Trị_Mặc_Định]
được
gửi
đến
stderr
báo
lỗi
và
kết
thúc
chương
trình
${
[TÊN_BIẾN]
?[Giá_Trị_Mặc_Định]
}
[sửa]
Nếu
biến
[TÊN_BIẾN]
chưa
khai
báo
thì
giá
trị
của
[Giá_Trị_Mặc_Định]
được
gửi
đến
stderr
báo
lỗi
và
kết
thúc
chương
trình.
Ngoài
trường
hợp
này
ra,
giá
trị
[TÊN_BIẾN]
được
trả
về
và
giữ
nguyên
hiện
trạng
của
[TÊN_BIẾN]
Thí dụ[sửa]
#!/bin/bash
echo "Default_string is `whoami`" echo -e "Default Expression Test (DXT) \${variable-Default_string}" echo "Not delare variable- DXT return: ${me-`whoami`}" echo "Current value of the variable= $me" me1= echo "Variable contains null value- DXT return: ${me1-`whoami`}" echo "Current value of the variable= $me1" me2=yep echo "Not null variable- DXT return: ${me2-`whoami`}" echo "Current value of the variable= $me2" echo "---------------" echo -e "Default Expression Test (DXT) \${variable:-Default_string}" echo "Not delare variable- DXT return: ${mee:-`whoami`}" echo "Current value of the variable= $mee" mee1= echo "Variable contains null value- DXT return: ${mee1:-`whoami`}" echo "Current value of the variable= $mee1" mee2=yep echo "Not null variable- DXT return: ${mee2:-`whoami`}" echo "Current value of the variable= $mee2" exit
Truy cập có điều chỉnh giá trị của một biến[sửa]
Một biến trong Linux nếu không bị giới hạn bởi các điều kiện ràng buộc khi khai báo thì nội dung mặc định của nó được hiểu là một chuỗi kí tự. Dãy kí tự này có độ dài bằng không nếu biến không được gán giá trị khác null nào.
BASH hỗ trợ nhiều phép toán để lấy về một cách có định dạng của giá trị chứa trong một biến: Ở đây một dạng thức được hiểu là biểu thức trong đó có chứa các kí tự phỏng định.
Phần thí dụ 6.9 sẽ minh họa rõ ràng cho cách dùng.
${
[TÊN_BIẾN]
#[Dạng_Thức]
}
[sửa]
Trả
về
giá
trị
của
biến
[TÊN_BIẾN]
sau
khi
đã
cắt
bỏ
phần
ngắn
nhất
tương
hợp
với
[Dạng_Thức]
tính
từ
phần
đầu
của
biến
[TÊN_BIẾN]
(nếu
có
thể)
${
[TÊN_BIẾN]
##[Dạng_Thức]
}
[sửa]
Trả
về
giá
trị
của
biến
[TÊN_BIẾN]
sau
khi
đã
cắt
bỏ
phần
dài
nhất
tương
hợp
với
[Dạng_Thức]
tính
từ
phần
đầu
của
biến
[TÊN_BIẾN]
(nếu
có
thể)
${
[TÊN_BIẾN]
%[Dạng_Thức]
}
[sửa]
Trả
về
giá
trị
của
biến
[TÊN_BIẾN]
sau
khi
đã
cắt
bỏ
phần
ngắn
nhất
tương
hợp
với
[Dạng_Thức]
tính
từ
phần
cuối
của
biến
[TÊN_BIẾN]
(nếu
có
thể)
${
[TÊN_BIẾN]
%%[Dạng_Thức]
}
[sửa]
Trả
về
giá
trị
của
biến
[TÊN_BIẾN]
sau
khi
đã
cắt
bỏ
phần
dài
nhất
tương
hợp
với
[Dạng_Thức]
tính
từ
phần
cuối
của
biến
[TÊN_BIẾN]
(nếu
có
thể)
${
[TÊN_BIẾN]
:[Vị_Trí]
}
[sửa]
Trả
về
dãy
kí
tự
con
mà
[TÊN_BIẾN]
chứa,
dãy
kí
tự
này
bắt
đầu
từ
vị
trí
thứ
[Vị_Trí]
cho
đến
hết
phần
còn
lại
nội
dung
của
[TÊN_BIẾN]
${
[TÊN_BIẾN]
:[Vị_Trí]
:[Độ_dài]
}
[sửa]
Trả
về
chuỗi
kí
tự
con
mà
[TÊN_BIẾN]
chứa,
chuỗi
kí
tự
này
bắt
đầu
từ
vị
trí
thứ
[Vị_Trí]
và
chỉ
chứa
đến
[Độ_dài]
kí
tự
lấy
từ
nội
dung
của
[TÊN_BIẾN]
${
[TÊN_BIẾN]
/[Dạng_Thức]
/[Chuỗi_Kí_tự_Thay_Thế]
}
[sửa]
Tìm
trong
nội
dung
của
[TÊN_BIẾN]
chuỗi
kí
tự
đầu
tiên
nào
tương
hợp
với
[Dạng_Thức]
và
thay
thế
chuỗi
đó
bằng
chuỗi
kí
tự
[Chuỗi_Kí_tự_Thay_Thế]
.
Nếu
[Chuỗi_Kí_tự_Thay_Thế]
không
có
mặt
trong
biểu
thức
thì
chuỗi
con
tìm
thấy
sẽ
bị
xóa
(thay
vì
thay
thế.)
${
[TÊN_BIẾN]
//[Dạng_Thức]
/[Chuỗi_Kí_tự_Thay_Thế]
}
[sửa]
Tìm
trong
nội
dung
của
[TÊN_BIẾN]
tất
cả
các
chuỗi
kí
tự
nào
tương
hợp
với
[Dạng_Thức]
và
thay
thế
chúng
bằng
chuỗi
kí
tự
[Chuỗi_Kí_tự_Thay_Thế]
.
Nếu
[Chuỗi_Kí_tự_Thay_Thế]
không
có
mặt
trong
biểu
thức
thì
những
chuỗi
con
tìm
thấy
sẽ
bị
xóa
(thay
vì
thay
thế.)
Thí dụ[sửa]
Thí dụ1:
#Using wild card characters to strip off: $str=abcd-123-efg echo "${str#*-*}" #result: 123-efg echo "${str##*-??}" #result: gh echo "${str%%?-*} #result: abc echo "${str%*-*} #result: abcd-123
Thí dụ2:
#change all filenames which have extension as ".text" #to the filenames which have extension as ".txt" for myfile in *.text #see loop command session later do mv $myfile ${myfile%text}txt done
Thí dụ3:
#get substrings of str and its length str="abcdefgh" str1=${#str} #string length of str should be 9 str2=${str:2} #substring cdefgh str3=${str:4:2} #substring ef
Thí dụ4:
#!/bin/bash # matching.sh
# Pattern matching using the # ## % %% parameter substitution operators.
var1=abcd12345abc6789 pattern1=a*c # * (wild card) matches everything between a - c.
echo echo "Number of characters in ${var1} = ${#var1}" echo.
echo "pattern1 = $pattern1" # a*c (everything between 'a' and 'c') echo "--------------" echo '${var1#$pattern1} =' "${var1#$pattern1}" # d12345abc6789 # Shortest possible match, strips out first 3 characters abcd12345abc6789.
echo '${var1##$pattern1} =' "${var1##$pattern1}" # 6789 # Longest possible match, strips out first 12 characters abcd12345abc6789.
echo; echo; echo.
pattern2=b*9 # everything between 'b' and '9' echo "var1 = $var1" # Still abcd12345abc6789 echo echo "pattern2 = $pattern2" echo "--------------" echo '${var1%pattern2} =' "${var1%$pattern2}" # abcd12345a # Shortest possible match, strips out last 6 characters abcd12345abc6789.
echo '${var1%%pattern2} =' "${var1%%$pattern2}" # a # Longest possible match, strips out last 12 characters abcd12345abc6789.
# Remember, # and ## work from the left end (beginning) of string, # % and %% work from the right end.
echo
exit 0
Truy cập các đặc tính khác của biến[sửa]
Một số lệnh khác liên quan đến sử dụng tên biến tưong đối có ích là
${#
[TÊN_BIẾN]
}
[sửa]
Trả
về
giá
trị
độ
dài
của
dãy
kí
tự
mà
biến
[TÊN_BIẾN]
chứa
${!
[Tiền_Tố]
*}
[sửa]
Trả
về
tên
của
tất
cả
các
biến
nào
bắt
đầu
bằng
[Tiền_Tố]
Nếu
có
nhiều
hơn
một
biến
với
cùng
tiền
tố
thì
chúng
được
hiển
thị
theo
thứ
tự
trong
bảng
kí
tự
ASCII
và
ngăn
cách
nhau
bởi
kí
tự
trống
Lưu
ý:
Các
viết
trên
bắt
buộc
phải
có
dấu
*
đứng
ngay
sau
[Tiền_Tố]
và
dấu
này
không
thể
thiếu
hay
thay
thế
bằng
dấu ?.
Trong
trường
hợp
viết
biểu
thức
trên
dưới
dạng
không
có
dấu
*
(tức
là
${!
[Tiền_Tố]
}
)
thì
BASH
sẽ
hiểu
đây
là
cách
dùng
biến
tham
chiếu
gián
tiếp
sẽ
được
đề
cập
trong
bài
tới
)
Thí dụ[sửa]
my_var="value1" my_oldvar="value2" my_Exvar="value3" myvar="VALUE" echo "{!my_*}" # the above command return: my_Exvar my_oldvar my_var echo "Content of \$myvar is: $myvar, and its length: ${#myvar}" #the above command return: "Content of $myvar is: VALUE, and its length: 5"
Biểu thị nội dung string[sửa]
Trong
BASH
nội
dụng
của
một
biến
nếu
không
được
định
nghĩa
chuyên
biệt
thì
sẽ
được
hiểu
là
chuỗi
kí
tự
tức
là
kiểu
string
.
Đó
đó,
ngoài
các
cách
thức
truy
cập
nêu
trong
mục
5,
6.
và
7,
BASH
còn
hỗ
trợ
các
phương
thức
khác
nhau
để
biểu
thị
nội
dung
của
một
string:
Chuỗi
kí
tự
với
ngoặc
kép
"[string]
"[sửa]
Gần giống như C/C++ các chuỗi kí tự có thể được đặt trong ngoặc kép và có thể được "mở rộng" thông qua cách dùng các kí tự thoát (escape character)
Thí dụ:
myName="Nguyen Van Hai" mySentence="My name is: $myName" myParagraph="Hello! \n\t$mySentence\n" # display a varibale iside a string echo "value of \$mysentence is : $mySentence" #display a paragraph without enabling escape character feature echo "$myParagraph" #OK! correct it by using option -e echo -e "$myParagraph"
Chuỗi
kí
tự
với
dấu
sắc
'[string]
'[sửa]
Khác với dấu ngoặc kép các string lưu giữ dạng này sẽ không "mở rộng" các kí tự thoát trong mọi dạng
Thí dụ:
myName="Nguyen Van Hai" # see how it is assigned myVar1='the value of \$myName is: $myName' myVar2="the value of \$myName is: $myName" #wait & see ! echo $myVar1 echo $myVar2 #however echo "$myVar1" echo "$myVar2" #and the last test mySign='\$' echo "mySign is: $mySign"
Chuỗi
kí
tự
với
dấu
huyền
`[Mệnh_Lệnh]
`
hay
ngoặc
đơn
$(
[Mệnh_Lệnh]
)
[sửa]
BASH dùng cách này để cho phép gán nội dung hiển thị của một mệnh lệnh vào thành nội dung của một biến hay một biểu thức: Thí dụ1: Hai đọan mã sau đây tương đương dùng để xoá mọi tập tin thông thường (không phải là thư mục) trong thư mục hiện hoạt
Thí dụ1:
for myFile in $(ls .); do rm -f $myFile done myDirContent=`ls .` echo "The content of current directory now:" echo "$myDirContent" for myFile in `$ls .`; do rm -f $myFile done myDirContent="$(ls .)" echo "The content of current directory now:" echo "$myDirContent"
Thí dụ2:
myDir="./test" echo "content of ./test is: `ls $myDir`"
Sử dụng kí tự thoát[sửa]
Kí tự thoát có thể dùng trong biểu thị nội dung của một string theo cả hai cách nêu trong 8.1 và 8.2 (xem thêm thí dụ trong 8.2). Sau đây là danh mục các kí tự thoát:
Kí tự thoát ANSI-C[sửa]
-
\a Phát tiếng kêu "beep" hay nhấp nháy (Nếu Hệ điều hành hỗ trợ)
-
\b Kí tự bước lùi (backspace)
-
\f Kí tự "form feed"
-
\n Kí tự đầu dòng (newline)
-
\r Kí tự xuống hàng (carriage return)
-
\t Kí tự nhảy bước ngang (horizontal tab)
-
\v Kí tự nhảy bước dọc (vertical tab)
-
\\ Dấu nghiên về (backslash )
-
Thí dụ:
-
echo -e "the directory C:\\Windows\\Command"
#display string: 'the directory C:\Windows\Command'
-
\' Dấu trích dẫn đơn (single quote)
-
\nnn Giá trị bát phân nnn được hiểu theo bảng đối chiếu ASCII
-
Thí dụ:
-
echo -e "\042" #display " sign
-
\xHH Giá trị thập lục phân HH (Có thể viết 1 hay 2 số thập lục H)
-
\cx Kí tự "control-x"
-
\" Dấu "
-
\$ Dấu $
-
Thí dụ:
-
echo
-e
"I
said:
\"I
love
you!\",
Mom.
Can
you
give
me
\$10.00 ?"
Kí
tự
thoát
hiển
thị
màu
dùng
cho
lệnh
echo
[sửa]
Trong chế độ màn hình đầu cuối (console screen) và không phải là xterm hay các ngỏ ra từ X window thì các hiển thị từ lệnh echo có thể dùng các màu cho nền và cho chữ. Để làm việc này, người ta cần gọi thêm tham số -e (cho chế độ dùng kí tự thoát) và dùng cú pháp dạng
echo -e $"\\033[[Loại]
;[Mã_Màu]
m[Chuỗi_Hiển_Thị]
"
Trong
đó,
[Loại]
và
[Mã_Màu]
được
mô
tả
trong
bảng
sau:
Lưu ý: Màn hình sẽ không hiển thị đúng hay sẽ không hiển thị màu khi dùng các lệnh này trong xterm hay trong Xwindow
-
[loại]
Ý nghiã 0 Chế độ mặc định thông thường 1 Tô đậm; chế độ sáng 5 Nhấp nháy 6 Nhấp nháy nhanh 7 Chế độ đảo ngược (màu nền -> màu mặt chữ và nguợc lại)
-
mã màu Ý nghiã 30 Chữ đen 31 Chữ đỏ 32 Chữ lục 33 Chữ vàng 34 Chữ xanh dương 35 Chữ tím 36 Chữ xanh da trời (cyan) 37 chữ trắng 40 Nền đen 41 Nền đỏ 42 Nền lục 43 Nền vàng 44 Nền xanh dương 45 Nền tím 46 Nền xanh da trời 47 Nền màu xám
Thí dụ1: echo -e $"\\033[1;32mThe Green Text" Thí dụ2: echo -en $"\\033[5;31mFatal Error. Enter code to exit " read A