ฟังก์ชัน Bash shell เป็นวิธีการจัดกลุ่มคำสั่ง UNIX / Linux หลายคำสั่งสำหรับการดำเนินการในภายหลังโดยใช้ชื่อเดียวสำหรับกลุ่ม . ฟังก์ชั่นเชลล์ทุบตีสามารถดำเนินการได้เหมือนกับคำสั่ง Unix ปกติ ฟังก์ชันของเชลล์ถูกดำเนินการในบริบทของเชลล์ปัจจุบันโดยไม่ต้องสร้างกระบวนการใหม่เพื่อแปลความหมาย
ทั้งนามแฝงและฟังก์ชันของ bash ช่วยให้คุณสามารถกำหนดทางลัดสำหรับคำสั่งที่ยาวกว่าหรือซับซ้อนกว่าได้ อย่างไรก็ตาม นามแฝงไม่อนุญาตโฟลว์การควบคุม อาร์กิวเมนต์ และกลอุบายอื่นๆ ที่ฟังก์ชันเหล่านี้จะอนุญาตตามที่อธิบายไว้ในบทช่วยสอนนี้
บทความนี้เป็นส่วนหนึ่งของชุดการสอนทุบตีที่กำลังดำเนินอยู่ อ้างถึงบทแนะนำก่อนหน้าของเราเกี่ยวกับการแนะนำ bash, สถานะ bash ที่มีอยู่ และตัวอย่างนามแฝงของ bash
ไวยากรณ์เพื่อสร้างฟังก์ชันทุบตี:
function functionname() { commands . . }
- ฟังก์ชัน เป็นคีย์เวิร์ดซึ่งเป็นทางเลือก
- ชื่อฟังก์ชัน เป็นชื่อของฟังก์ชัน
- คำสั่ง – รายการคำสั่งที่จะดำเนินการในฟังก์ชัน
ฟังก์ชันยอมรับอาร์กิวเมนต์ ในระหว่างการดำเนินการ อาร์กิวเมนต์ของฟังก์ชันจะกลายเป็นพารามิเตอร์ตำแหน่ง พารามิเตอร์ตำแหน่ง 0 จะมีชื่อสคริปต์ที่ยังคงไม่เปลี่ยนแปลง
คุณสามารถเรียกใช้ฟังก์ชัน bash จากบรรทัดคำสั่งดังที่แสดงด้านล่าง:
$ functionname arg1 arg2
- เมื่อเชลล์ตีความคำสั่ง Linux อันดับแรกจะพิจารณาถึงฟังก์ชันพิเศษในตัว เช่น break, continue, eval, exec เป็นต้น จากนั้นจะค้นหาฟังก์ชันของเชลล์
- สถานะการออกของฟังก์ชัน bash คือสถานะการออกของคำสั่งสุดท้ายที่ดำเนินการในเนื้อหาของฟังก์ชัน
หมายเหตุ: วางคำจำกัดความของฟังก์ชันเชลล์ในไฟล์เริ่มต้นของเชลล์ (เช่น .bash_profile ) ด้วยวิธีนี้ ฟังก์ชันเชลล์จะพร้อมให้คุณใช้งานเสมอจากบรรทัดคำสั่ง อ้างถึงบทความลำดับการดำเนินการทุบตีก่อนหน้าของเราเพื่อระบุว่าเมื่อใดที่ .bash_profile จะถูกดำเนินการ
ตัวอย่างที่ 1:ฟังก์ชันแสดงรายการไฟล์แบบยาวที่มีนามสกุลที่กำหนด
ฟังก์ชัน “lsext” ใช้สำหรับค้นหารายการไฟล์ในไดเร็กทอรีปัจจุบัน ซึ่งมีนามสกุลตามที่แสดงด้านล่าง ฟังก์ชันนี้ใช้การรวมกันของคำสั่ง find และคำสั่ง ls เพื่อให้งานสำเร็จ
$ 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
ตัวอย่างที่ 2 Bash Function เพื่อรันคำสั่ง Linux ที่กำหนดในกลุ่มไฟล์
ในตัวอย่างต่อไปนี้ ฟังก์ชัน “batchexec” จะค้นหาไฟล์ที่มีนามสกุลที่กำหนดและดำเนินการคำสั่งที่กำหนดในไฟล์ที่เลือกเหล่านั้น
$ 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
ในตัวอย่างข้างต้น โปรแกรมจะค้นหาไฟล์เชลล์สคริปต์ทั้งหมดที่มีนามสกุล .sh และเปลี่ยนการอนุญาตเป็น 755 (สิทธิ์ทั้งหมดสำหรับผู้ใช้ สำหรับกลุ่ม และสิทธิ์ในการอ่านและดำเนินการอื่นๆ) ในการกำหนดฟังก์ชัน คุณอาจสังเกตเห็น “${@:2}” ซึ่งให้พารามิเตอร์ตำแหน่งที่สองและต่อไปนี้ (คุณลักษณะการขยายเชลล์)
ตัวอย่างที่ 3 Bash Function เพื่อสร้างรหัสผ่านแบบสุ่ม
ฟังก์ชันต่อไปนี้ใช้เพื่อสร้างรหัสผ่านที่คาดเดายากแบบสุ่มพร้อมอักขระพิเศษตามความยาวที่กำหนด หากไม่กำหนดความยาวโดยค่าเริ่มต้น ระบบจะสร้างด้วยความยาว 12 อักขระ
$ function rpass() { cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12} } $ rpass 6 -Ju.T[[ $ rpass Gz1f!aKN^""k
ในตัวอย่างข้างต้น เมื่อเรียกใช้ rpass ด้วยอาร์กิวเมนต์ 6 จะสร้างรหัสผ่านแบบสุ่มด้วยอักขระ 6 ตัว และ rpass ที่ไม่มีอาร์กิวเมนต์จะสร้างรหัสผ่านความยาว 12 อักขระ ${1:-12} หมายความว่าถ้า $1 ไม่ถูกตั้งค่าหรือ null 12 จะถูกส่งคืน มิฉะนั้น ค่า $1 จะถูกแทนที่
ตัวอย่างที่ 4 ฟังก์ชัน Bash เพื่อรับที่อยู่ IP ของอินเทอร์เฟซที่กำหนด
ตัวอย่างต่อไปนี้กำหนดฟังก์ชันที่เรียกว่า 'getip' ซึ่งยอมรับชื่ออินเทอร์เฟซเป็นอาร์กิวเมนต์ และให้ที่อยู่ IP ที่กำหนดบนอินเทอร์เฟซที่กำหนดในเครื่อง (โดยค่าเริ่มต้นจะส่งคืนที่อยู่ IP eth0 ) สิ่งนี้ใช้คำสั่ง ifconfig เพื่อรับที่อยู่ 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
ตัวอย่าง 5. ฟังก์ชั่น Bash เพื่อพิมพ์รายละเอียดเครื่อง
ตัวอย่างนี้กำหนดฟังก์ชันที่ให้ข้อมูลที่จำเป็นทั้งหมดเกี่ยวกับเครื่อง ผู้ใช้สามารถกำหนดและเรียกใช้ฟังก์ชันนี้ในไฟล์เริ่มต้น เพื่อให้คุณได้รับข้อมูลเหล่านี้ในระหว่างการเริ่มต้น
$ 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
ตัวอย่างที่ 6:ฟังก์ชัน Bash เพื่อจัดรูปแบบเอาต์พุต ls ให้ดีขึ้น
ฟังก์ชันต่อไปนี้จะล้างหน้าจอ วางเคอร์เซอร์ที่ด้านบนของหน้าจอ เรียกใช้ ls แล้ววางเคอร์เซอร์ที่ส่วนท้ายของหน้าจอ
$ function ll () { clear; tput cup 0 0; ls --color=auto -F --color=always -lhFrt; tput cup 40 0; } $ ll
แสดงโค้ดฟังก์ชันโดยใช้คำสั่ง type
type เป็นเชลล์ในตัวที่ใช้เพื่อดูโค้ดฟังก์ชัน
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" }
เพื่อการอ้างอิงที่ง่ายของคุณ รับฟังก์ชันทั้ง 6 ฟังก์ชันที่กล่าวถึงบทความนี้จากไฟล์ฟังก์ชันตัวอย่าง .bash_profile
เพิ่มฟังก์ชันเหล่านี้ทั้งหมดลงในไฟล์ ~/.bash_profile ของคุณ เพื่อให้แน่ใจว่าคุณสามารถเข้าถึงฟังก์ชันเหล่านี้ได้ตลอดเวลาโดยไม่ต้องสร้างมันขึ้นมาทุกครั้ง