ที่ทางของคำสั่ง : ใน Shell
เคยเขียน (มั้ง) มาทีละว่า ทุกคำสั่งใน linux มันมีที่ทางของมันหมด แม้จะเป็นคำสั่งเล็กๆ ที่ทำหน้าที่ง่อยๆ ก็ตามที … แต่วันนี้จะมานำเสนอคำสั่ง :
(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
ให้ เลยต้องใช้คำสั่ง :
แทน
author