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