เชลล์สคริปต์เบื้องต้น ตอนที่ 7 - วงวน for
www.tanabutr.co.th/photobook
วงวนที่ใช้บ่อยในเชลล์คงจะหนีไม่พ้น for. จริงๆแล้ว for ก็เป็นคำสั่ง (ประกอบภายใน) เหมือนกับคำสั่งทั่วๆไปแต่จะเรียกคำสั่งแบบนี้ว่า compound command. ไวยกรณ์ของคำสั่งได้แก่
forname inwords docommand ... done
เนื่องจากคำสั่งต่างๆที่สามารถใช้ ; คั่นแทนการขึ้นบรรทัดได้, ถ้าจะเขียนเป็นบรรทัดเดียวก็จะเป็นแบบนี้.
forname inwords ; docommands ; ...; done
ตัวอย่างต่อไปนี้เป็นการแปลงไฟล์ .gif ทุกไฟล์ที่อยู่ในไดเรกทอรีที่ทำงานอยู่ให้เป็น .png ด้วยบรรทัดคำสั่งบรรทัดเดียว.
$ for i in *gif; do convert $i `basename $i .gif`.png; done
ในวงวนแต่และรอบจะมีตัวแปร i ที่กำหนดไว้ในช่วงต้นของคำสั่ง (for i in *gif) และค่าของตัวแปรนี้จะนำมาจากรายการคำที่อยู่หลังคำว่า in. ในที่นี้สมมติว่าในไดเรกทอรีที่ทำงานอยู่มีไฟล์ a.gif, b.gif, c.gif, ค่าของตัวแปร i ในแต่ละรอบก็เปลี่ยนไปเรื่อยๆจาก a.gif, b.gif, ...
basename เป็นคำสั่งสำหรับสกัดเอาชื่อไฟล์ไฟล์โดยตัดส่วนขยายชื่อไฟล์ (file extension) .gif ออก. เช่นถ้าชื่อไฟล์เป็น a.gif, basename a.gif .gif ก็จะให้ผลเป็น a. และในตัวอย่างเติม .png เข้าไป. นอกจากจะใช้สกัดเอาส่วนที่เป็นชื่อไฟล์ที่ไม่มีส่วนขยายชื่อไฟล์แล้ว, โดยปรกติจะใช้ตัดส่วนที่เป็นไดเรกทอรีที่อยู่หน้าชื่อไฟล์ออกไป. เช่น /usr/bin/perl ถ้าเอาไปเป็นอาร์กิวเมนต์ของคำสั่ง basename ก็จะได้ผลเป็น perl.
คำสั่ง convert เป็นคำสั่งหนึ่งในแพกเกจ ImageMagick ใช้สำหรับเปลี่ยนรูปจากฟอร์แมตหนึ่งไปเป็นอีกฟอร์แมตหนึ่ง. คำสั่งนี้จะใช้ส่วนขยายชื่อไฟล์เช่น .png ประกอบว่าการพิจารณาว่าเราต้องการเปลี่ยนจาก .gif ไปเป็นฟอร์แมตอะไร. ถ้าต้องการเปลี่ยนเป็นฟอร์แมต .jpg ก็แค่เปลี่ยนอาร์กิวเมนต์ของคำสั่งให้มีส่วนขยายชื่อไฟล์เป็น .jpg. นอกจากคำสั่ง convert ที่ใช้แปลงฟอร์แมตรูปจากบรรทัดคำสั่งแล้ว, ยังมีคำสั่งอื่นๆสำหรับหมุนรูป, สร้างรูป ฯลฯ ด้วย.
ถ้ารู้สึกว่าเขียนคำสั่งบรรทัดเดียวแล้วอาจจะงง, จะเขียนเป็นหลายบรรทัดก็ได้.
$ for i in *gif > do convert $i `basename $i .jpg`.png > done
ในกรณีที่เป็นวงวนซับซ้อนจะดูเข้าใจง่ายกว่าบรรทัดเดียว. เครื่องหมาย ">" คือพรอมต์รอง (secondary prompt) โดยปริยายซึ่งสามารถตั้งค่าให้เป็นตัวอักษรอื่นๆได้ถ้าไม่ชอบด้วยตัวแปรสภาพแวดล้อม $PS2.
วันนี้ขอจบเท่านี้แล้วกันครับ.