ฟังก์ชัน 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 ของคุณ เพื่อให้แน่ใจว่าคุณสามารถเข้าถึงฟังก์ชันเหล่านี้ได้ตลอดเวลาโดยไม่ต้องสร้างมันขึ้นมาทุกครั้ง