:
(colon ตัวเดียว) ซึ่งเป็นคำสั่งที่ไม่ทำอะไรเลยอ้าว แล้วเมื่อมันไม่ทำหน้าที่อะไรเลย จะมีไว้ทำไมหละ?
งั้นต้องถามก่อนว่า เคยประสบปัญหานี้มั้ย
> # ตั้งตัวแปรไว้ใช้ดีกว่า > foo="hahaha" > # ทำงานอื่นไปเรื่อยๆๆๆๆ > # เอ๊ะ ตัวแปร $foo โดนเปลี่ยนค่า (?) ไปเป็นอะไรแล้วนะ? > $foo hahaha: command not foundด้านบนนี้เป็น user error เอง อยากดูค่าก็อย่าลืม
echo
สิ :Pอย่างไรก็ตาม อย่าลืมว่า Shell มันเป็น programming language ตัวหนึ่งเลย ความสามารถที่หลายๆ คนลืมคือเราสามารถทำการคำนวณใน Shell ได้
> i=0 > for f in * > do > [ -s "$f" ] && i=$((i+1)) > done > echo $iโค้ดด้านบนนี้จะถามว่าไฟล์ในแฟ้มปัจจุบัน มีกี่ไฟล์ที่มีเนื้อหา (ขนาดไม่เป็น 0 byte) ซึ่ง counter จะเพิ่มขึ้นตรงหลังเครื่องหมาย && นั่นเอง
ในโลกความจริงเราไม่ได้เขียนโค้ดอย่างนี้ตลอด อาจมีบางครั้งที่ต้องเอาการคำนวณแยกไว้ในที่เดี่ยวๆ เช่น
> i=0 > for ... > do > # ทำอะไรซักอย่าง > i=$((i+1)) > doneเขียนไปเขียนมาจะพบว่า
i=$((i+1))
มันตลกสิ้นดี ยิ่งเมื่อรู้ว่า Shell เขียน i++
ได้! แต่อย่าลืมว่าถ้าเปลี่ยนไปเขียนตรงๆ ก็จะเจอปัญหาเดิม> $((i++)) 0: command not foundทั่วไปแล้ว การเขียนในแนวนี้จะเป็นการสร้างตัวนับเพื่อบอกว่า process นี้ทำงานไปถึงไหนแล้ว ซึ่งมันสามารถเอาไปแทรกไว้กับคำสั่ง
echo
ได้> echo "now doing item number: $((++i))"แต่ถ้าไม่ต้องการให้มัน
echo
อะไรระหว่างทางหละ? นี่แหละคือจุดยืนของคำสั่ง :
> : $((i++))ป.ล. Shell รุ่นเก่าๆ ไม่มีคำสั่ง
true
เลยต้องใช้คำสั่ง :
แทน
No comments:
Post a Comment