Hàm shell Bash là cách nhóm một vài lệnh UNIX/Linux để thực thi sau dùng một tên duy nhất cho nhóm. Hàm shell Bash có thể thực thi giống như một lệnh Unix thông thường. Hàm shell được thực thi trong ngữ cảnh shell hiện tại mà không tạo tiến trình mới để thông dịch chúng.
Cả alias và hàm bash đều cho phép định nghĩa phím tắt cho lệnh dài hoặc phức tạp hơn. Tuy nhiên, alias không cho phép điều khiển luồng, đối số, và các thủ thuật khác mà hàm cho phép như trong hướng dẫn này.
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. Tham khảo hướng dẫn trước về bash introduction, bash exit status và ví dụ bash alias.
Cú pháp tạo hàm bash:
function functionname() {
commands
.
.
}
- function là từ khóa tùy chọn.
- functionname là tên hàm
- commands – Danh sách lệnh được thực thi trong hàm.
Hàm chấp nhận đối số. Khi thực thi, các đối số cho hàm trở thành tham số vị trí. Tham số vị trí 0 sẽ có tên script không thay đổi.
Bạn có thể gọi hàm bash từ dòng lệnh như dưới:
$ functionname arg1 arg2
- Khi shell thông dịch lệnh Linux, nó trước tìm trong các hàm built-in đặc biệt như break, continue, eval, exec v.v., rồi tìm hàm shell.
- Trạng thái thoát của hàm bash là trạng thái thoát của lệnh cuối cùng thực thi trong thân hàm.
Lưu ý: Đặt định nghĩa hàm shell trong file khởi động shell (ví dụ, .bash_profile). Cách này, hàm shell luôn có sẵn cho bạn từ dòng lệnh. Tham khảo bài trước về trình tự thực thi bash để xác định khi .bash_profile được thực thi.
Ví Dụ 1: Hàm Hiển Thị Danh Sách File Dài Với Phần Mở Rộng Cho Trước
Hàm lsext dùng để tìm danh sách file trong thư mục hiện tại, có phần mở rộng cho trước như dưới. Hàm này dùng kết hợp lệnh find và ls để hoàn thành.
$ function lsext() {
find . -type f -iname '*.'${1}'' -exec ls -l {} \; ;
}
$ cd ~
$ lsext txt
-rw-r--r-- 1 root root 24 Dec 15 14:00 InMorning.txt
-rw-r--r-- 1 root root 184 Dec 16 11:45 Changes16.txt
-rw-r--r-- 1 root root 458 Dec 18 11:04 Changes18.txt
-rw-r--r-- 1 root root 1821 Feb 4 15:01 ChangesOfDB.txt
Ví Dụ 2. Hàm Bash Thực Thi Lệnh Linux Cho Trước Trên Nhóm File
Trong ví dụ sau, hàm batchexec tìm file với phần mở rộng cho trước và thực thi lệnh cho trước trên các file được chọn.
$ function batchexec() {
find . -type f -iname '*.'${1}'' -exec ${@:2} {} \; ;
}
$ cd ~
$ batchexec sh ls
$ batchexec sh chmod 755
$ ls -l *.sh
-rwxr-xr-x 1 root root 144 Mar 9 14:39 debug.sh
-rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh
-rwxr-xr-x 1 root root 22 Mar 18 08:32 t.sh
Trong ví dụ trên, nó tìm tất cả file script shell với phần mở rộng .sh, và đổi quyền thành 755. (Tất cả quyền cho user, cho group và others read và execute). Trong định nghĩa hàm bạn nhận thấy "${@:2}" cho tham số vị trí thứ hai trở đi (tính năng mở rộng shell).
Ví Dụ 3. Hàm Bash Tạo Mật Khẩu Ngẫu Nhiên
Hàm sau dùng để tạo mật khẩu mạnh ngẫu nhiên với ký tự đặc biệt cho độ dài cho trước. Nếu độ dài không cho, mặc định tạo 12 ký tự.
$ function rpass() {
cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12}
}
$ rpass 6
-Ju.T[[
$ rpass
Gz1f!aKN^""k
Trong ví dụ trên, khi rpass thực thi với đối số 6, nó tạo mật khẩu ngẫu nhiên 6 ký tự và rpass không đối số tạo mật khẩu 12 ký tự. ${1:-12} nghĩa là nếu $1 unset hoặc null thì 12 sẽ trả về, ngược lại giá trị $1 sẽ thay thế.
Ví Dụ 4. Hàm Bash Lấy Địa Chỉ IP Của Giao Diện Cho Trước
Ví dụ sau định nghĩa hàm getip chấp nhận tên giao diện làm đối số, và cho địa chỉ IP gán trên giao diện đó trong máy. (mặc định trả về IP eth0). Sử dụng lệnh ifconfig để lấy ip-address.
$ function getip() {
/sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}';
}
$ getip
15.110.106.86
$ getip eth0
15.110.106.86
$ getip lo
127.0.0.1
Ví Dụ 5. Hàm Bash In Chi Tiết Máy
Ví dụ này định nghĩa hàm cho tất cả thông tin cần thiết về máy. Người dùng có thể định nghĩa và gọi hàm trong file khởi động, để bạn nhận thông tin này khi khởi động.
$ function mach() {
echo -e "\nMachine information:" ; uname -a
echo -e "\nUsers logged on:" ; w -h
echo -e "\nCurrent date :" ; date
echo -e "\nMachine status :" ; uptime
echo -e "\nMemory status :" ; free
echo -e "\nFilesystem status :"; df -h
}
$ mach
Machine information:
Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux
Users logged on:
root pts/2 ptal.mot Wed10 0.00s 1.35s 0.01s w -h
Current date :
Thu Mar 18 11:59:36 CET 2010
Machine status :
11:59:36 up 7 days, 3 min, 1 user, load average: 0.01, 0.15, 0.15
Memory status :
total used free shared buffers cached
Mem: 2059768 2033212 26556 0 81912 797560
-/+ buffers/cache: 1153740 906028
Swap: 4192956 48164 4144792
Filesystem status :
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 12G 12G 0 100% /
tmpfs 1006M 377M 629M 38% /dev/shm
/dev/sdc5 9.9G 409M 9.0G 5% /mydisk
Ví Dụ 6: Hàm Bash Định Dạng Ls Output Tốt Hơn
Hàm sau sẽ xóa màn hình, đặt con trỏ lên đầu màn hình, thực thi ls, rồi đặt con trỏ ở cuối màn hình.
$ function ll () {
clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0;
}
$ ll
Hiển Thị Mã Hàm Sử Dụng Lệnh Type
type là shell built-in dùng để xem mã hàm.
Cú pháp: type function-name
$ type ll
ll is a function
ll () {
clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0;
alias ls="ls --color=auto -F"
}
Để dễ tham khảo, lấy tất cả 6 hàm trong bài này từ file .bash_profile mẫu.
Thêm tất cả các hàm này vào file ~/.bash_profile của bạn, để đảm bảo bạn luôn có quyền truy cập các hàm này mọi lúc mà không cần tạo lại mỗi lần.