neizod's speculation

insufficient data for meaningful answer

ที่ทางของคำสั่ง : ใน Shell

Sunday, May 25, 2014, 08:24 AM

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