เชลล์สคริปต์เบื้องต้น ตอนที่ 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)]}
วันนี้เป็นวันศุกร์
ไวยกรณ์ที่เกี่ยวข้องกับการแทนค่าแบบ $(
$((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 อ่านข้อมูลจากคำที่อยู่หลังเครื่องหมาย "<<<" เหมือนกับอ่านข้อมูลจากไฟล์.