Hàm Bash shell là một cách để nhóm một số lệnh UNIX / Linux để thực thi sau này bằng cách sử dụng một tên duy nhất cho nhóm . Hàm Bash shell có thể được thực thi giống như một lệnh Unix thông thường. Các hàm shell được thực thi trong ngữ cảnh shell hiện tại mà không cần tạo bất kỳ quy trình mới nào để diễn giải chúng.
Cả bí danh và hàm bash đều cho phép bạn xác định phím tắt cho các lệnh dài hơn hoặc phức tạp hơn. Tuy nhiên, bí danh không cho phép luồng điều khiển, đối số và những thứ phức tạp khác mà các chức năng này sẽ cho phép như được giải thích 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 thực hiện. Tham khảo hướng dẫn trước đây của chúng tôi về giới thiệu bash, trạng thái tồn tại bash và ví dụ về bí danh bash.
Cú pháp để tạo một hàm bash:
function functionname() { commands . . }
- chức năng là một từ khóa không bắt buộc.
- tên hàm là tên của hàm
- lệnh - Danh sách các lệnh được thực hiện trong các chức năng.
Hàm chấp nhận các đối số. Trong quá trình thực thi, các đối số của hàm sẽ trở thành các tham số vị trí. Tham số vị trí 0 sẽ có tên tập lệnh không thay đổi.
Bạn có thể gọi hàm bash từ dòng lệnh như hình dưới đây:
$ functionname arg1 arg2
- Khi shell diễn giải một lệnh Linux, trước tiên nó sẽ xem xét các hàm tích hợp sẵn đặc biệt như break, continue, eval, execute, v.v., sau đó tìm các 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 được thực thi trong thân hàm.
Lưu ý: Đặt các định nghĩa hàm shell trong tệp khởi động shell (ví dụ:.bash_profile). Bằng 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 viết trình tự thực thi bash trước đó của chúng tôi để xác định khi nào .bash_profile sẽ được thực thi.
Ví dụ 1:Hàm hiển thị danh sách dài các tệp có phần mở rộng đã cho
Hàm “lsext” được sử dụng để tìm danh sách các tệp trong thư mục hiện tại, có phần mở rộng đã cho như hình dưới đây. Hàm này sử dụng kết hợp lệnh find và lệnh ls để hoàn thành công việc.
$ 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 một lệnh Linux nhất định trên một nhóm tệp
Trong ví dụ sau, hàm “batchexec” tìm các tệp có phần mở rộng đã cho và thực hiện lệnh đã cho trên các tệp đã 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 thấy tất cả các tệp kịch bản shell có phần mở rộng .sh và thay đổi quyền của nó thành 755. (Tất cả quyền cho người dùng, cho nhóm và những người khác quyền đọc và thực thi). Trong định nghĩa hàm, bạn có thể nhận thấy “$ {@:2}” cung cấp các tham số vị trí thứ hai và sau (tính năng mở rộng trình bao).
Ví dụ 3. Hàm Bash để tạo mật khẩu ngẫu nhiên
Hàm sau được sử dụng để tạo mật khẩu mạnh ngẫu nhiên với ký tự đặc biệt cho độ dài nhất định. Nếu độ dài không được cung cấp theo mặc định, độ dài sẽ tạo với độ dài 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 được thực thi với đối số 6, nó tạo ra mật khẩu ngẫu nhiên với 6 ký tự và rpass không có đối số sẽ tạo ra mật khẩu có độ dài 12 ký tự. $ {1:-12} có nghĩa là nếu $ 1 không được đặt hoặc giá trị null 12 sẽ được trả về, giá trị khác của $ 1 sẽ được thay thế.
Ví dụ 4. Hàm Bash để lấy địa chỉ IP của một giao diện nhất định
Ví dụ sau định nghĩa một hàm có tên là ‘getip’ chấp nhận tên giao diện làm đối số và cung cấp địa chỉ IP được chỉ định trên giao diện nhất định trong máy. (theo mặc định nó trả về địa chỉ ip eth0). Thao tác này sử dụng lệnh ifconfig để lấy địa chỉ ip.
$ 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 xác định chức năng cung cấp tất cả thông tin cần thiết về máy. Người dùng có thể xác định và gọi hàm này trong tệp khởi động để bạn nhận được những thông tin này trong quá trình 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 đầu ra ls tốt hơn
Hàm sau sẽ xóa màn hình, đặt con trỏ ở đầu màn hình, thực hiện lệnh 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ã chức năng bằng lệnh gõ
type là một shell được tích hợp sẵn dùng để xem mã hàm.
Syntax: 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" }
Để bạn dễ dàng tham khảo, hãy lấy tất cả 6 hàm được đề cập trong bài viết này từ tệp các hàm .bash_profile mẫu này.
Thêm tất cả các hàm này vào tệp ~ / .bash_profile của bạn, để đảm bảo bạn luôn có quyền truy cập vào các hàm này mà không cần phải tạo nó mọi lúc.