Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

บทช่วยสอนเกี่ยวกับฟังก์ชัน Bash Shell พร้อมตัวอย่างที่ใช้งานได้จริง 6 ตัวอย่าง

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