เราไม่สามารถจินตนาการถึงภาษาการเขียนโปรแกรมได้หากไม่มีแนวคิดเรื่องอาร์เรย์ ไม่สำคัญว่าจะนำไปใช้ในภาษาต่างๆ อย่างไร แทนที่จะเป็นอาร์เรย์ช่วยเราในการรวมข้อมูล คล้ายหรือแตกต่างกัน ภายใต้ชื่อสัญลักษณ์เดียว
เนื่องจากเรามีความกังวลเกี่ยวกับเชลล์สคริปต์ บทความนี้จะช่วยคุณในการเล่นกับเชลล์สคริปต์บางตัวซึ่งใช้ประโยชน์จากแนวคิดของอาร์เรย์นี้
การเริ่มต้นและการใช้งานอาร์เรย์
ด้วย bash เวอร์ชันใหม่กว่า จะสนับสนุนอาร์เรย์แบบหนึ่งมิติ อาร์เรย์สามารถประกาศได้อย่างชัดเจนโดย ประกาศ เชลล์ในตัว
declare -a var
แต่ไม่จำเป็นต้องประกาศตัวแปรอาร์เรย์ดังที่กล่าวข้างต้น เราสามารถแทรกแต่ละอิลิเมนต์ลงในอาร์เรย์ได้โดยตรงดังนี้
var[XX]=<value>
โดยที่ 'XX' หมายถึงดัชนีอาร์เรย์ หากต้องการลบองค์ประกอบอาร์เรย์ให้ใช้ไวยากรณ์วงเล็บปีกกาเช่น
${var[XX]}
หมายเหตุ :การจัดทำดัชนีอาร์เรย์เริ่มต้นด้วย 0 เสมอ
อีกวิธีหนึ่งที่สะดวกในการเริ่มต้นอาร์เรย์ทั้งหมดคือการใช้วงเล็บคู่ดังที่แสดงด้านล่าง
var=( element1 element2 element3 . . . elementN )
มีอีกวิธีหนึ่งในการกำหนดค่าให้กับอาร์เรย์ วิธีการเริ่มต้นนี้เป็นประเภทย่อยของวิธีการที่อธิบายไว้ก่อนหน้านี้
array=( [XX]=<value> [XX]=<value> . . . )
นอกจากนี้เรายังสามารถอ่าน/กำหนดค่าให้กับอาร์เรย์ในช่วงเวลาดำเนินการโดยใช้ read เชลล์ในตัว
read -a array
ตอนนี้เมื่อดำเนินการคำสั่งข้างต้นภายในสคริปต์ จะรอการป้อนข้อมูลบางอย่าง เราจำเป็นต้องจัดเตรียมองค์ประกอบอาร์เรย์ที่คั่นด้วยช่องว่าง (และไม่ใช่การขึ้นบรรทัดใหม่) หลังจากป้อนค่าแล้วให้กด Enter เพื่อสิ้นสุด
ในการข้ามผ่านองค์ประกอบอาร์เรย์ เรายังสามารถใช้ for loop ได้
for i in “${array[@]}” do #access each element as $i. . . done
สคริปต์ต่อไปนี้สรุปเนื้อหาของส่วนนี้โดยเฉพาะ
#!/bin/bash array1[0]=one array1[1]=1 echo ${array1[0]} echo ${array1[1]} array2=( one two three ) echo ${array2[0]} echo ${array2[2]} array3=( [9]=nine [11]=11 ) echo ${array3[9]} echo ${array3[11]} read -a array4 for i in "${array4[@]}" do echo $i done exit 0
การดำเนินการต่างๆ บนอาร์เรย์
การดำเนินการสตริงมาตรฐานจำนวนมากทำงานบนอาร์เรย์ ดูตัวอย่างสคริปต์ต่อไปนี้ซึ่งใช้การดำเนินการบางอย่างกับอาร์เรย์ (รวมถึงการดำเนินการสตริง)
#!/bin/bash array=( apple bat cat dog elephant frog ) #print first element echo ${array[0]} echo ${array:0} #display all elements echo ${array[@]} echo ${array[@]:0} #display all elements except first one echo ${array[@]:1} #display elements in a range echo ${array[@]:1:4} #length of first element echo ${#array[0]} echo ${#array} #number of elements echo ${#array[*]} echo ${#array[@]} #replacing substring echo ${array[@]//a/A} exit 0
ต่อไปนี้เป็นผลลัพธ์ที่ได้จากการรันสคริปต์ด้านบน
apple apple apple bat cat dog elephant frog apple bat cat dog elephant frog bat cat dog elephant frog bat cat dog elephant 5 5 6 6 Apple bAt cAt dog elephAnt frog
ฉันคิดว่าไม่มีความสำคัญในการอธิบายสคริปต์ข้างต้นในรายละเอียดเนื่องจากเป็นการอธิบายตนเอง หากจำเป็น ฉันจะอุทิศส่วนหนึ่งในซีรีส์นี้โดยเฉพาะกับการปรับแต่งสายอักขระ
การแทนที่คำสั่งด้วยอาร์เรย์
การทดแทนคำสั่งกำหนดเอาต์พุตของคำสั่งหรือหลายคำสั่งในบริบทอื่น ในบริบทของอาร์เรย์นี้ เราสามารถแทรกเอาต์พุตของคำสั่งเป็นองค์ประกอบเดี่ยวของอาร์เรย์ ไวยากรณ์มีดังนี้
array=( $(command) )
โดยค่าเริ่มต้น เนื้อหาในผลลัพธ์ของคำสั่งที่คั่นด้วยช่องว่างสีขาวจะถูกเสียบเข้ากับอาร์เรย์เป็นองค์ประกอบแต่ละรายการ สคริปต์ต่อไปนี้แสดงรายการเนื้อหาของไดเร็กทอรี ซึ่งเป็นไฟล์ที่มีสิทธิ์ 755
#!/bin/bash ERR=27 EXT=0 if [ $# -ne 1 ]; then echo "Usage: $0 <path>" exit $ERR fi if [ ! -d $1 ]; then echo "Directory $1 doesn't exists" exit $ERR fi temp=( $(find $1 -maxdepth 1 -type f) ) for i in "${temp[@]}" do perm=$(ls -l $i) if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then echo ${i##*/} fi done exit $EXT
การจำลองอาร์เรย์สองมิติ
เราสามารถแสดงเมทริกซ์ 2 มิติได้อย่างง่ายดายโดยใช้อาร์เรย์ 1 มิติ ใน แถวหลัก องค์ประกอบการแสดงในแต่ละแถวของเมทริกซ์จะถูกเก็บไว้ในดัชนีอาร์เรย์ตามลำดับ สำหรับเมทริกซ์ mXn สามารถเขียนสูตรสำหรับสิ่งเดียวกันได้
matrix[i][j]=array[n*i+j]
ดูตัวอย่างสคริปต์อื่นสำหรับการเพิ่ม 2 เมทริกซ์และพิมพ์เมทริกซ์ผลลัพธ์
#!/bin/bash read -p "Enter the matrix order [mxn] : " t m=${t:0:1} n=${t:2:1} echo "Enter the elements for first matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read x[$(($n*$i+$j))] done done echo "Enter the elements for second matrix" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do read y[$(($n*$i+$j))] z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]})) done done echo "Matrix after addition is" for i in `seq 0 $(($m-1))` do for j in `seq 0 $(($n-1))` do echo -ne "${z[$(($n*$i+$j))]}\t" done echo -e "\n" done exit 0
แม้ว่าจะมีข้อจำกัดในการใช้งานอาร์เรย์ภายในเชลล์สคริปต์ แต่ก็มีประโยชน์ในบางสถานการณ์ โดยเฉพาะอย่างยิ่งเมื่อเราจัดการกับการแทนที่คำสั่ง เมื่อมองจากมุมมองของผู้ดูแลระบบ แนวคิดของอาร์เรย์ปูทางสำหรับการพัฒนาสคริปต์พื้นหลังจำนวนมากในระบบ GNU/Linux