เชลล์สคริปต์เบื้องต้น ตอนที่ 7 - วงวน for

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

www.tanabutr.co.th/photobook


วงวนที่ใช้บ่อยในเชลล์คงจะหนีไม่พ้น for. จริงๆแล้ว for ก็เป็นคำสั่ง (ประกอบภายใน) เหมือนกับคำสั่งทั่วๆไปแต่จะเรียกคำสั่งแบบนี้ว่า compound command. ไวยกรณ์ของคำสั่งได้แก่

for name in words 
do
    command
    ...
done

เนื่องจากคำสั่งต่างๆที่สามารถใช้ ; คั่นแทนการขึ้นบรรทัดได้, ถ้าจะเขียนเป็นบรรทัดเดียวก็จะเป็นแบบนี้.

for name in words; do commands; ...; 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.

วันนี้ขอจบเท่านี้แล้วกันครับ.