Tương tự như loạt bài Unix Sed và Unix Awk đang diễn ra, chúng ta sẽ đăng tải nhiều bài về Bash scripting, bao phủ tất cả kỹ thuật bash scripting với ví dụ thực tế.
Shell là một chương trình, thông dịch lệnh người dùng. Lệnh được nhập trực tiếp bởi người dùng hoặc đọc từ file gọi là shell script.
Shell gọi là shell tương tác, khi nó đọc đầu vào trực tiếp từ người dùng.
Shell gọi là shell không tương tác, khi nó đọc lệnh từ file và thực thi. Trong trường hợp này, shell đọc từng dòng của file script từ trên xuống dưới, và thực thi từng lệnh như thể nó được gõ trực tiếp bởi người dùng.
In giá trị của biến shell built-in $-, để biết shell là tương tác hay không tương tác.
# echo $- himBH
Lưu ý: Biến $- chứa "i" khi shell là tương tác.
Unix có nhiều loại Shell. Bourne shell (sh), Bourne again shell (bash), C shell (csh), Korn shell (ksh), Tenex C shell (tcsh). Dùng lệnh which hoặc whereis unix để tìm vị trí shell cụ thể như dưới.
# which bash /bin/bash # whereis bash bash: /bin/bash /usr/share/man/man1/bash.1.gz
Bạn có thể chuyển đổi giữa các shell, bằng cách gõ tên shell. Ví dụ, gõ csh để chuyển sang C shell.
Viết và Thực Thi Shell Script
Ví Dụ 1. Hello World Bash Script
- Tạo script bằng cách gõ hai dòng sau vào file dùng trình soạn thảo yêu thích.
- Bạn có thể chọn bất kỳ tên file nào. Tên file không được trùng lệnh built-in Unix.
- Script luôn bắt đầu bằng hai ký tự
'#!'gọi là she-bang. Điều này chỉ ra file là script, và nên thực thi dùng trình thông dịch (/bin/bash) chỉ định bằng phần còn lại của dòng đầu tiên trong file. - Thực thi script như dưới. Nếu có vấn đề thực thi shell script, tham khảo hướng dẫn thực thi shell script
- Khi bạn thực thi lệnh
"bash helloworld.sh", nó khởi động shell không tương tác và truyền tên file như đối số cho nó. - Dòng đầu nói cho hệ điều hành shell nào để sinh ra thực thi script.
- Trong ví dụ trên, trình thông dịch bash thông dịch script và thực thi lệnh từng cái từ trên xuống dưới.
- Bạn thậm chí có thể thực thi script, không cần
"bash"đầu bằng:- Đổi quyền trên script cho phép bạn (User) thực thi nó, dùng lệnh
"chmod u+x helloworld.sh". - Thư mục chứa script nên nằm trong biến môi trường PATH. Nếu không, bạn có thể thực thi script bằng cách chỉ định đường dẫn tuyệt đối của script.
- Đổi quyền trên script cho phép bạn (User) thực thi nó, dùng lệnh
echolà lệnh đơn giản xuất đối số ta cho nó. Nó cũng dùng để in giá trị biến.
$ cat helloworld.sh #!/bin/bash echo Hello World
$ bash helloworld.sh Hello World
File Khởi Động Bash
Như thảo luận trước trong bài trình tự thực thi cho .bash_profile và file liên quan, khi bash được gọi như shell tương tác, nó trước đọc và thực thi lệnh từ /etc/profile. Nếu /etc/profile không tồn tại, nó đọc và thực thi lệnh từ ~/.bash_profile, ~/.bash_login và ~/.profile theo thứ tự cho. Tùy chọn --noprofile có thể dùng khi shell khởi động để ức chế hành vi này.
Thường bash_profile của bạn thực thi ~/.bashrc. Nếu thích, bạn có thể hiện thông điệp chào mừng. Chỉ chạy khi bạn đăng nhập lần đầu. Bạn có thể export biến gì bạn muốn, và đặt alias sẽ chạy và có sẵn khi bạn mở shell. Khi shell đăng nhập thoát, Bash đọc và thực thi lệnh từ file ~/.bash_logout.
Ví Dụ 2. In Thông Điệp Chào Mừng Khi Đăng Nhập
Gõ nội dung sau vào file bash_profile. Nếu file không tồn tại, tạo file với nội dung dưới.
$ cat ~/.bash_profile hname=\`hostname\` echo "Welcome on $hname."
Khi bạn đăng nhập shell tương tác, bạn sẽ thấy thông điệp chào mừng như dưới.
login as: root root@dev-db's password: Welcome on dev-db
Ví Dụ 3. In Thông Tin Hệ Thống
Khi bạn đăng nhập shell tương tác, bạn có thể hiển thị tên kernel cài trên server, phiên bản bash, uptime và thời gian trên server.
$cat ~/.bash_profile hname=\`hostname\` echo "Welcome on $hname." echo -e "Kernel Details: " \`uname -smr\` echo -e "\`bash --version\`" echo -ne "Uptime: "; uptime echo -ne "Server time : "; date
Khi bạn khởi chạy shell tương tác, nó in thông điệp như dưới.
login as: root root@dev-db's password: Welcome on dev-db Kernel Information: Linux 2.6.18-128 x86_64 GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. Uptime: 11:24:01 up 21 days, 13:15, 3 users, load average: 0.08, 0.18, 0.11 Server time : Tue Feb 22 11:24:01 CET 2010
Ví Dụ 4. In Chi Tiết Đăng Nhập Lần Cuối
Nếu nhiều user dùng cùng máy với cùng đăng nhập, thì chi tiết như máy từ đó đăng nhập lần cuối, và thời gian họ đăng nhập, sẽ là chi tiết hữu ích nhất. Ví dụ này in chi tiết đăng nhập lần cuối khi khởi động shell tương tác.
$ cat ~/.bash_profile
hname=\`hostname\`
echo "Welcome on $hname."
echo -e "Kernel Details: " \`uname -smr\`
echo -e "\`bash --version\`"
echo -ne "Uptime: "; uptime
echo -ne "Server time : "; date
lastlog | grep "root" | awk {'print "Last login from : "$3
print "Last Login Date & Time: ",$4,$5,$6,$7,$8,$9;}'
Trong lúc khởi động, bạn nhận thông điệp như dưới.
login as: root root@dev-db's password: Welcome on dev-db Kernel Information: Linux 2.6.18-128 x86_64 GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. Uptime: 11:24:01 up 21 days, 13:15, 3 users, load average: 0.08, 0.18, 0.11 Server time : Tue Feb 22 11:24:01 CET 2010 Last login from : sasikala-laptop Last Login Date & Time: Tue Feb 22 11:24:01 +0100 2010
Ví Dụ 5. Xuất Biến Và Thiết Lập Alias Khi Khởi Động
Các lệnh phổ biến nhất bạn sẽ dùng trong file .bashrc và .bash_profile là lệnh export và alias.
Một alias đơn giản là thay thế một đoạn văn bản bằng đoạn khác. Khi bạn chạy alias, nó đơn giản thay thế thứ bạn gõ bằng thứ alias bằng. Ví dụ, nếu bạn muốn đặt alias cho lệnh ls để liệt kê file/thư mục với màu, làm sau:
alias ls 'ls --color=tty'
Nếu bạn thêm lệnh này vào một file khởi động, bạn có thể thực thi lệnh ls, nơi nó sẽ tự động thay thế bằng lệnh ls --color=tty.
Lệnh export dùng để đặt biến môi trường. Các biến môi trường khác nhau được dùng bởi hệ thống, hoặc ứng dụng khác. Chúng đơn giản là cách đặt tham số mà bất kỳ ứng dụng/script nào có thể đọc. Nếu bạn đặt biến không có lệnh export, biến đó chỉ tồn tại cho tiến trình cụ thể đó.
Trong ví dụ dưới, nó xuất biến môi trường HISTSIZE. Dòng bắt đầu bằng # là dòng chú thích.
$ cat /etc/profile
alias ls 'ls --color=tty'
# Setup some environment variables.
export HISTSIZE=1000
PATH=$PATH:$HOME/bin:/usr/bin:/bin/usr:/sbin/etc
export PATH
export SVN_SH=${SVN_RSH-ssh}