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

บทแนะนำ Bash Array ขั้นสูงสุดพร้อมตัวอย่าง 15 ตัวอย่าง

อาร์เรย์คือตัวแปรที่มีค่าหลายค่าอาจเป็นประเภทเดียวกันหรือคนละประเภทก็ได้ ไม่มีการจำกัดขนาดของอาร์เรย์ และไม่มีข้อกำหนดใด ๆ ที่ตัวแปรสมาชิกจะได้รับการจัดทำดัชนีหรือกำหนดแบบต่อเนื่องกัน ดัชนีอาร์เรย์เริ่มต้นด้วยศูนย์

ในบทความนี้ ให้เราตรวจสอบการทำงานของอาร์เรย์ต่างๆ 15 รายการใน bash

บทความนี้เป็นส่วนหนึ่งของชุดการสอน Bash ที่กำลังดำเนินอยู่ สำหรับผู้ที่ยังใหม่ต่อการเขียนสคริปต์ทุบตี ให้เริ่มต้นอย่างรวดเร็วจากบทแนะนำ Bash Scripting

1. การประกาศ Array และการกำหนดค่า

ใน bash อาร์เรย์จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อใช้ตัวแปรในรูปแบบเช่น

name[index]=value
  • name คือชื่อใดๆ สำหรับอาร์เรย์
  • ดัชนีอาจเป็นตัวเลขหรือนิพจน์ใดๆ ที่ต้องประเมินเป็นตัวเลขที่มากกว่าหรือเท่ากับศูนย์ คุณสามารถประกาศอาร์เรย์ที่ชัดเจนได้โดยใช้ประกาศ -a ชื่ออาร์เรย์
$ cat arraymanip.sh
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${Unix[1]}

$./arraymanip.sh
Red hat

ในการเข้าถึงองค์ประกอบจากอาร์เรย์ให้ใช้วงเล็บปีกกาเช่น ${name[index]}

2. การเริ่มต้นอาร์เรย์ในระหว่างการประกาศ

แทนที่จะเริ่มต้นแต่ละองค์ประกอบของอาร์เรย์แยกกัน คุณสามารถประกาศและเริ่มต้นอาร์เรย์โดยระบุรายการองค์ประกอบ (คั่นด้วยช่องว่างสีขาว) ด้วยวงเล็บปีกกา

Syntax:
declare -a arrayname=(element1 element2 element3)

หากองค์ประกอบมีอักขระช่องว่าง ให้ใส่เครื่องหมายคำพูด

#! /bin/bash
$cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');

ประกาศ -a ประกาศอาร์เรย์และองค์ประกอบทั้งหมดในวงเล็บคือองค์ประกอบของอาร์เรย์

3. พิมพ์ทั้ง Bash Array

มีหลายวิธีในการพิมพ์องค์ประกอบทั้งหมดของอาร์เรย์ ถ้าหมายเลขดัชนีเป็น @ หรือ * สมาชิกทั้งหมดของอาร์เรย์จะถูกอ้างอิง คุณสามารถสำรวจผ่านองค์ประกอบอาร์เรย์และพิมพ์โดยใช้คำสั่งวนซ้ำในทุบตี

echo ${Unix[@]}

# Add the above echo statement into the arraymanip.sh
#./t.sh
Debian Red hat Ubuntu Suse

การอ้างอิงถึงเนื้อหาของตัวแปรสมาชิกของอาร์เรย์โดยไม่ได้ระบุหมายเลขดัชนีจะเหมือนกับการอ้างอิงถึงเนื้อหาขององค์ประกอบแรก อันที่อ้างอิงด้วยดัชนีหมายเลขศูนย์

4. ความยาวของ Bash Array

เราสามารถหาความยาวของอาร์เรย์ได้โดยใช้พารามิเตอร์พิเศษที่เรียกว่า $#

${#arrayname[@]} ให้ความยาวของอาร์เรย์

$ cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora');
echo ${#Unix[@]} #Number of elements in the array
echo ${#Unix} #Number of characters in the first element of the array.i.e Debian
$./arraymanip.sh
4
6

5. ความยาวขององค์ประกอบที่ n ในอาร์เรย์

${#arrayname[n]} ควรกำหนดความยาวขององค์ประกอบที่ n ในอาร์เรย์

$cat arraymanip.sh
#! /bin/bash

Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${#Unix[3]} # length of the element located at index 3 i.e Suse

$./arraymanip.sh
4

6. การแยกโดยออฟเซ็ตและความยาวของอาร์เรย์

ตัวอย่างต่อไปนี้แสดงวิธีการแยก 2 องค์ประกอบเริ่มต้นจากตำแหน่งที่ 3 จากอาร์เรย์ที่เรียกว่า Unix

$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[@]:3:2}

$./arraymanip.sh
Suse Fedora

ตัวอย่างข้างต้นส่งคืนองค์ประกอบในดัชนีที่ 3 และดัชนีที่สี่ ดัชนีเริ่มต้นด้วยศูนย์เสมอ

7. การสกัดด้วยออฟเซ็ตและความยาว สำหรับองค์ประกอบเฉพาะของอาร์เรย์

เพื่อแยกเฉพาะสี่องค์ประกอบแรกจากองค์ประกอบอาร์เรย์ ตัวอย่างเช่น Ubuntu ซึ่งอยู่ที่ดัชนีที่สองของอาร์เรย์ คุณสามารถใช้ออฟเซ็ตและความยาวสำหรับองค์ประกอบเฉพาะของอาร์เรย์ได้

$cat arraymanip.sh
#! /bin/bash

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[2]:0:4}

./arraymanip.sh
Ubun

ตัวอย่างข้างต้นจะแยกอักขระสี่ตัวแรกจากองค์ประกอบที่จัดทำดัชนีที่ 2 ของอาร์เรย์

8. ค้นหาและแทนที่ในองค์ประกอบอาร์เรย์

ตัวอย่างต่อไปนี้ ค้นหา Ubuntu ในองค์ประกอบอาร์เรย์ และแทนที่ด้วยคำว่า 'SCO Unix'

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

echo ${Unix[@]/Ubuntu/SCO Unix}

$./arraymanip.sh
Debian Red hat SCO Unix Suse Fedora UTS OpenLinux

ในตัวอย่างนี้ จะแทนที่องค์ประกอบในดัชนีที่ 2 'Ubuntu' ด้วย 'SCO Unix' แต่ตัวอย่างนี้จะไม่แทนที่เนื้อหาอาร์เรย์อย่างถาวร

9. เพิ่มองค์ประกอบใน Bash Array ที่มีอยู่

ตัวอย่างต่อไปนี้แสดงวิธีการเพิ่มองค์ประกอบในอาร์เรย์ที่มีอยู่

$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Unix=("${Unix[@]}" "AIX" "HP-UX")
echo ${Unix[7]}

$./arraymanip.sh
AIX

ในอาร์เรย์ที่เรียกว่า Unix องค์ประกอบ 'AIX' และ 'HP-UX' จะถูกเพิ่มในดัชนีที่ 7 และ 8 ตามลำดับ

10. ลบองค์ประกอบออกจากอาร์เรย์

unset ใช้เพื่อลบองค์ประกอบออกจาก array.unset จะมีผลเช่นเดียวกับการกำหนด null ให้กับองค์ประกอบ

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

unset Unix[3]
echo ${Unix[3]}

สคริปต์ด้านบนจะพิมพ์ null ซึ่งเป็นค่าที่มีอยู่ในดัชนีที่ 3 ตัวอย่างต่อไปนี้แสดงวิธีหนึ่งในการลบองค์ประกอบออกจากอาร์เรย์อย่างสมบูรณ์

$ cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
pos=3
Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})
echo ${Unix[@]}

$./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

ในตัวอย่างนี้ ${Unix[@]:0:$pos} จะให้องค์ประกอบ 3 ตัวแก่คุณโดยเริ่มจากดัชนีที่ 0 นั่นคือ 0,1,2 และ ${Unix[@]:4} จะให้องค์ประกอบจากดัชนีที่ 4 ไปยัง ดัชนีสุดท้าย และผสานทั้งเอาต์พุตด้านบน นี่เป็นวิธีแก้ไขปัญหาชั่วคราววิธีหนึ่งในการลบองค์ประกอบออกจากอาร์เรย์

11. ลบ Bash Array Elements โดยใช้รูปแบบ

ในเงื่อนไขการค้นหา คุณสามารถกำหนดรูปแบบ และเก็บองค์ประกอบที่เหลือไปยังอาร์เรย์อื่นดังที่แสดงด้านล่าง

$ cat arraymanip.sh
#!/bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora');
declare -a patter=( ${Unix[@]/Red*/} )
echo ${patter[@]}

$ ./arraymanip.sh
Debian Ubuntu Suse Fedora

ตัวอย่างข้างต้นจะลบองค์ประกอบที่มีสีแดง*

12. การคัดลอกอาร์เรย์

ขยายองค์ประกอบอาร์เรย์และเก็บไว้ในอาร์เรย์ใหม่ดังที่แสดงด้านล่าง

#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Linux=("${Unix[@]}")
echo ${Linux[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

13. การต่อกันของสอง Bash Array

ขยายองค์ประกอบของอาร์เรย์ทั้งสองและกำหนดให้กับอาร์เรย์ใหม่

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh
14

มันพิมพ์อาร์เรย์ที่มีองค์ประกอบของทั้งอาร์เรย์ 'Unix' และ 'Shell' และจำนวนขององค์ประกอบของอาร์เรย์ใหม่คือ 14

14. การลบอาร์เรย์ทั้งหมด

unset ใช้เพื่อลบอาร์เรย์ทั้งหมด

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
unset UnixShell
echo ${#UnixShell[@]}

$ ./arraymanip.sh
0

หลังจากยกเลิกการตั้งค่าอาร์เรย์ ความยาวของอาร์เรย์จะเป็นศูนย์ดังที่แสดงด้านบน

15. โหลดเนื้อหาของไฟล์ลงในอาร์เรย์

คุณสามารถโหลดเนื้อหาของไฟล์ทีละบรรทัดลงในอาร์เรย์ได้

#Example file
$ cat logfile
Welcome
to
thegeekstuff
Linux
Unix

$ cat loadcontent.sh
#!/bin/bash
filecontent=( `cat "logfile" `)

for t in "${filecontent[@]}"
do
echo $t
done
echo "Read file content!"

$ ./loadcontent.sh
Welcome
to
thegeekstuff
Linux
Unix
Read file content!

ในตัวอย่างข้างต้น แต่ละดัชนีขององค์ประกอบอาร์เรย์ได้พิมพ์ผ่าน for loop

แนะนำให้อ่าน

บทแนะนำ Bash Array ขั้นสูงสุดพร้อมตัวอย่าง 15 ตัวอย่างBash 101 Hacks โดย Ramesh Natarajan . ฉันใช้เวลาส่วนใหญ่กับสภาพแวดล้อม Linux โดยธรรมชาติแล้วฉันเป็นแฟนตัวยงของ Bash command line และ shell scripting 15 ปีที่แล้ว ตอนที่ฉันทำงานกับ *nix รสชาติต่างๆ ฉันเคยเขียนโค้ดจำนวนมากบน C shell และ Korn shell หลายปีต่อมา เมื่อฉันเริ่มทำงานบน Linux ในฐานะผู้ดูแลระบบ ฉันทำได้ค่อนข้างอัตโนมัติทุกงานที่เป็นไปได้โดยใช้ Bash shell scripting จากประสบการณ์ Bash ของฉัน ฉันได้เขียน Bash 101 Hacks eBook ที่มีตัวอย่างเชิงปฏิบัติ 101 ตัวอย่างทั้งบรรทัดคำสั่ง Bash และเชลล์สคริปต์ หากคุณกำลังคิดเกี่ยวกับการควบคุม Bash ให้เชี่ยวชาญ ลองอ่านหนังสือเล่มนี้ดู ซึ่งจะช่วยให้คุณควบคุมบรรทัดคำสั่งและเชลล์สคริปต์ของ Bash ได้