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