บทความนี้อยู่ในกลุ่มของบทความสอนเขียน shell script ซึ่ง shell script ที่จะสอนนั้นจะใช้ bash เป็น intepreter หรือตัวแปลภาษาครับ

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

ข้อมูลชนิดอาเรย์ใน bash หมายถึงโครงสร้างข้อมูลที่ใช้เก็บข้อมูลแบบลำดับการจัดเก็บข้อมูลในอาเรย์มี 2 วิธี

  • วิธีแรกกำหนดครั้งเดียวพร้อมกันหลายตัว โดยระบุสมาชิกภายใต้เครื่องหมายวงเล็บ ( ) แยกสมาชิกแต่ละตัวด้วยช่องว่าง
  • วิธีที่สองระบุผ่านตำแหน่งข้อมูลในอาเรย์ทีละตัวภายใต้เครื่องหมาย [ ]

การอ้างถึงข้อมูลเมื่อต้องการประมวลผล ใช้การระบุตำแหน่งที่จัดเก็บภายใต้เครื่องหมาย ${ } เช่น อาเรย์ a ตำแหน่งที่ 0 เมื่อต้องการอ้างถึงโดยใช้ ${ a[0] }  หากระบุ @ หรือ * แทนใน [] จะหมายถึงข้อมูลทุกตัวในอาเรย์ และขนาดของอาเรย์จะแทนด้วย ${ #a[@] }

ตัวอย่างการจัดเก็บข้อมูลในอาเรย์แบบที่ 1
fruit=( “Apple”   “Pie”    “Orange”   “Coconut” )

ตัวอย่างการจัดเก็บข้อมูลชุดเดียวกันในอาเรย์แบบที่ 2
fruit[0]=”Apple”
fruit[1]=”Pie”
fruit[2]=”Orange”
fruit[3]=”Coconut”

ตัวอย่างการแสดงผลข้อมูลในอาเรย์ทีละตัว

echo “ผลไม้ลำดับที่ 1 คือ ${fruit[0]}  ” ; 
echo “ผลไม้ลำดับสุดท้ายคือ ${fruit[3]}”

ผลลัพธ์จากคำสั่งด้านบนเป็นดังนี้ครับ

ผลไม้ลำดับที่ 1 คือ Apple
ผลไม้ลำดับสุดท้ายคือ Coconut

ลองสังเกตคำสั่งและผลลัพธ์ของคำสั่งต่อไปนี้นะครับ

echo ${ fruit[3] }  
Coconut

echo ${ fruit[@] }  
Apple  Pie  Orange  Coconut

echo ${ #fruit[@]}
4

อาเรย์ของ bash สามารถกำหนดข้อมูลต่างชนิดกันได้
เนื่องจากตัวแปรของ bash เป็นแบบ untype คือไม่ระบุชนิดข้อมูลคงตัวให้กับตัวแปร(ยกเว้นเมื่อกำหนดด้วยคำสั่ง declare ซึ่งจะขอกล่าวถึงในโอกาสถัดไป)  ลักษณะดังนี้จึงถูกสืบทอดมาให้กับโครงสร้างข้อมูลชนิดอาเรย์ด้วย  ตัวอย่างต่อไปนี้ผมลองใช้อาเรย์ BOOK เก็บข้อมูล ชื่อหนังสือ รหัส ISBN และ ราคาของหนังสือตามลำดับ

BOOK=(“Harry Potter”  90011234   256.35 )
echo  “ชื่อหนังสือ : ${BOOK[0]}”
echo  “ISBN : ${BOOK[1]}”
echo  “ราคาปก : ${BOOK[2]} บาท”

ผลลัพธ์จากคำสั่งด้านบนครับ

ชื่อหนังสือ : Harry Potter
ISBN : 90011234
ราคาปก : 256.35 บาท

อาเรย์ของ bash สามารถขยายขนาดได้
ลักษณะที่ยืดหยุ่นอีกประการหนึ่งของอาเรย์ ใน bash คือการที่สามารถขยายขนาดได้ ทำให้เราสามารถนำไปใช้ในงานที่หลากหลายมากขึ้นครับ ขอยกตัวอย่างจากอาเรย์ BOOK ข้างบน ผมจะเพิ่มหนังสืออีก 2 เล่มเข้าไปครับ

BOOK2=(“JAVA Programming” 90012346  350.00)
BOOK3=(“Bash Tutorial” 90056789 1250.50)
BOOK=( ${BOOK[@]}  ${BOOK2[@]}  ${BOOK3[@]} )

ในที่นี้ถ้าเรา ใช้คำสั่ง echo ${#BOOK[@]} จะได้ขนาดเป็น 9 และถ้าใช้คำสั่ง echo ${BOOK[@]} จะเห็นว่าข้อมูลของ BOOK2 และ BOOK3 ถูกนำมารวมไว้ในอาเรย์ BOOK ครับ

echo ${BOOK[@]}
Harry Potter 9000112 235.30 JAVA Programming 90012346 350.00 Bash Tutorial 90056789 1250.50

อาเรย์ใน bash มีแค่มิติเดียว
ข้อจำกัดอย่างหนึ่งของอาเรย์ใน bash คือเราไม่สามารถกำหนดนำอาเรย์มากำหนดให้กับอาเรย์(ฟังแล้วงงใช่ไหมครับ)  ซึ่งก็คือเราไม่สามารถใช้งานในลักษณะของอาเรย์ 2 มิติขึ้นไปได้ ครับ

Animal[0]=(“Dog” “Cat” “Pig”)   
bash: animal[0]: cannot assign list to array member 

 

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

Advertisements

7 คิดบน “สอนเขียน shellscript ตอนที่ 3 อาเรย์มาแล้วจ้าาา

  1. หากเราอ่านไฟล์ มาเก็บไว้ในตัวแปร ทีละบรรทัด เราต้องทำอย่างไรบ้างครับ เช่น ผมจะอ่านไฟล์ระบบที่ชื่อ /etc/network/interfaces มากเก็บไว้ในตัวแปร a[จำนวนบรรทัด]

    1. ขอโทษที่มาตอบช้าไปหน่อยนะครับ ผมขอยกตัวอย่างวิธีวนลูปอ่านข้อมูล ร่วมกับ redirection นะครับ

      i=0;
      while read item ; do
         data[i]=$item
         let i=i+1
      done  < /etc/network/interfaces
      
  2. Pingback: Soowoi's Blog

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s