เชลล์สคริปต์เบื้องต้น ตอนที่ 5 - ตัวแปรแถวลำดับ, +-*/

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


ไม่ได้เขียนหลายวัน, ยังไม่ลืมว่าจะเขียนคอลัมน์นี้ให้จบ.

ตัวแปรแถวลำดับ (array variable)

ตัวแปรแถวลำดับ (array) ที่ใช้ในเชลล์สร้างด้วยไวยกรณ์

name[index]=value

index เป็นตัวเลขเริ่มตั้งแต่ 0 เหมือนตัวแปรแถวลำดับของภาษาอื่นๆ. แต่เวลาสร้างจะข้ามไปก็ได้เช่น

$ arr[1]=var1

ในกรณีนี้ข้ามนิยามตัวแปรแถวลำดับตัวแรก (arr[0]) ไปนิยามตัวที่สองเลย. เวลาอ้างอิงค่าที่อยู่ในตัวแปรให้ใช้เครื่องหมายปีกกาช่วยจับกลุ่มดังนี้.

$ echo ${arr[0]} ${arr[1]} ${arr[2]}
var1

ตัวแปรที่ไม่ได้นิยามไว้เช่น arr[0], arr[2] ก็จะไม่แสดงอะไรและไม่มี error ด้วย. วิธีการสร้างตัวแปรแถวลำดับและตั้งค่าไปในตัวมีไวยกรณ์ดังนี้

name=(value1 ... valuen)

ตัวอย่างเช่น

$ day=(อาทิตย์ จันทร์ อังคาร พุธ พฤหัสบดี ศุกร์ เสาร์)
$ echo วันนี้เป็นวัน${day[`date +%w`]}
วันนี้เป็นวันศุกร์

นึกตัวอย่างการใช้ตัวแปรลำดับในเชลล์ดีๆไม่ออกเพราะไม่ค่อยได้ใช้ครับ.

การแทนค่าคำสั่ง

ในตัวอย่าง

echo วันนี้เป็นวัน${day[`date +%w`]}

มีการนำผลลัพธ์ของคำสั่งมาแทนในตำแหน่งที่ต้องการโดยใช้เครื่องหมาย back quote (`). วิธีการนี้เรียกว่า command substitution. คำสั่ง date +%w จะเป็นการจัดรูปแบบการแสดงผลเลือกแสดงวันเวลาเฉพาะวันในสัปดาห์ (+%w) และแสดงเป็นตัวเลขโดยที่เริ่มจากวันอาทิตย์ให้เป็นเลข 0. และใช้ back quote เพื่อเอาค่า 0 นี้ไปใช้ใน index ของตัวแปรแถวลำดับต่อไป.

ปรกติจะนิยมใช้ back quote เพราะมีความเข้ากันได้กับเชลล์อื่นหรือเชลล์เก่าๆ. ใน bash มีไวยกรณ์ต่างหากที่ให้ผลเหมือนกับการใช้ back quote ด้วยได้แก่

$(command)
$ echo วันนี้เป็นวัน${day[$(date +%w)]}
วันนี้เป็นวันศุกร์

ไวยกรณ์ที่เกี่ยวข้องกับการแทนค่าแบบ $(command) ได้แก่การกระจายนิพจน์คณิตศาตร์ (Arithmetic Expansion) มีไวยกรณ์ดังนี้

$((expression))

เรามาดูตัวอย่างกันเลยเข้าใจง่ายกว่าว่าเอาไว้ทำอะไร.

$ echo $((2*2+3*3))
13
$ echo $((1/2))
0

การกระจายนิพจน์คณิตศาตร์เอาไว้ในสคริปต์ที่ต้องการคำนวณบวกลบคูณหารง่ายๆ. ให้สังเกตว่าใช้ได้แค่จำนวนเต็มเท่านั้น. ดังนั้นถ้าผลลัพธ์ของ 1 หาร 2 ได้ 0. ถ้าจะใช้คำนวณทศนิยมด้วยคงต้องใช้คำสั่ง bc แทนตัวอย่างเช่น.

$ echo `bc -l<<<'(1/2)'`
.50000000000000000000

คำสั่ง bc เป็นโปรแกรมเครื่องคิดเลขแบบบรรทัดคำสั่ง. สร้างฟังก์ชัน, คำนวณคณิตศาสตร์ชั้นสูงเช่นยกกำลัง, sine, tan ฯลฯ ได้ด้วย. ปรกติคำสั่ง bc จะรับข้อมูลจาก standard input เป็นแบบโต้ตอบ. ในกรณีนี้ใช้เทคนิคให้ bc อ่านข้อมูลจากคำที่อยู่หลังเครื่องหมาย "<<<" เหมือนกับอ่านข้อมูลจากไฟล์.