วันพฤหัสบดีที่ 12 พฤษภาคม พ.ศ. 2554

Bug ของ Command Line : expr.... (หรือไม่ใช่ ???)

Introduction
    หลังจาก ราคาน้ำมันดิบ WTI  ร่วงจาก ร้อยกว่าเหรียญสหรัฐฯ มาอยู่ต่ำกว่า 100 เหรียญสหรัฐฯ  ผมก็พบ Bug ของ คำสั่ง expr บน Linux     มันเกี่ยวกัน ตรงไหน สงสัยไหม ???

    คำสั่ง expr เป็นคำสั่งที่ใช้ ตรวจสอบเงื่อนไขทาง คณิตศาสตร์ ว่าเป็นจริง หรือ เท็จ

                expr  เงื่อนไขทางคณิตศาสตร์

    โดย ถ้า ....
        เงื่อนไข เป็นจริง expr  จะส่งค่า 1 กลับมา

    แต่ถ้า

        เงื่อนไข เป็นเท็จ  expr  จะส่งค่า 0 กลับมา

    ควรทราบ ----> expr จะใส่ \ นำหน้า เครื่องหมาย> สำหรับการเปรียบเทียบ มากกว่า เพื่อ ให้  expr ไม่สับสน ระหว่าง "มากกว่า"  หรือ การเปลี่ยนทิศทาง ผลลัพธ์ คำสั่ง (Redirection)

    ตัวอย่าง

tonhom@Orion:~$
tonhom@Orion:~$ expr 1 \> 2
0
tonhom@Orion:~$
tonhom@Orion:~$

1 > 2 ไม่จริง ดังนั้น expr จะ Return ค่า 0 กลับมา

tonhom@Orion:~$
tonhom@Orion:~$ expr 1 \< 2
1
tonhom@Orion:~$
tonhom@Orion:~$

1 < 2 จริง ดังนั้น expr จะ Return ค่า 1 กลับมา

แล้วไงต่อ....

     ผมเขียน Bash Shell Script เพื่อสร้าง ตาราง แสดง ราคาย้อนหลัง ของ น้ำมันดิบ WTI    โดย จะใช้ ตัวอักษร สีแดง แสดง ราคา ถ้า ราคามันลดลง...

 การเปรียบเทียบ ตัวเลขทศนิยม ใน Bash Shell Script ไม่สามารถทำได้โดยตรง ต้อง อาศัยเจ้าคำสั่ง expr ช่วยเปรียบเทียบให้....

 Script ก็ดูเหมือนจะใช้งานได้ปกติ.... จนกระทั่งวันนั้น....  วันที่ น้ำมันดิบ WTI มันต่ำกว่า 100 เหรียญสหรัฐฯ



tonhom@Orion:~$
tonhom@Orion:~$ expr 100.1 \> 100.2
0
tonhom@Orion:~$
tonhom@Orion:~$

100.1 > 100.2 ไม่จริง  ผลลัพธ์ ของ expr ยังถูกต้อง.... 

tonhom@Orion:~$
tonhom@Orion:~$ expr 100.1 \> 99.8
0
tonhom@Orion:~$
tonhom@Orion:~$




อ้าว.... ไงเป็นงี้....  100.1 > 99.8 เป็นจริงนี้ ทำไม expr จึง Return 0 กลับมา....
หรือนี้เป็น Bug ของ expr...

เพราะ ชีวิต ยังต้องเดินต่อไป....
    หาวิธีแก้ไขปัญหาชั่วคราว.... (แฮะๆ ไอ้ที่ผ่านๆ มา แก้ไขชั่วคราว นี้ มักจะใช้งานชั่วโคตร....)

ทดลองเอา เลขศูนย์ ใส่เข้าไปด้านหน้า  99.8  เป็น 099.8

tonhom@Orion:~$
tonhom@Orion:~$ expr 100.1 \> 099.8
1
tonhom@Orion:~$
tonhom@Orion:~$

เออ ใช้งานได้วุ้ย....


งั้นก็เอาเลขศูนย์ แปะเข้าไปด้านหน้าเลขทุกตัวเลยแล้วกัน....

tonhom@Orion:~$
tonhom@Orion:~$ expr 0100.1 \> 099.8
0
tonhom@Orion:~$
tonhom@Orion:~$



อ้าว กรรม... ใช้งานไม่ได้ซะงั้น....




tonhom@Orion:~$
tonhom@Orion:~$ expr 1000.1 \> 099.8
1
tonhom@Orion:~$
tonhom@Orion:~$

เอางี้ แล้วกัน แก้ไขโดยทำเลขให้ จำนวนหลักเท่ากัน.... ถ้าไม่เท่า เอาเลข 0 ไปแปะ ด้านหน้าเพื่อให้ จำนวนหลัก เท่ากัน....

อาศัยเจ้า คำสั่ง awk....

tonhom@Orion:~$
tonhom@Orion:~$ echo 99.8 | awk '{printf "%05.1f", $1}' ; echo
099.8
tonhom@Orion:~$
tonhom@Orion:~$ 


tonhom@Orion:~$ 
tonhom@Orion:~$ echo 100.2 | awk '{printf "%05.1f", $1}' ; echo
100.2
tonhom@Orion:~$
tonhom@Orion:~$

เอา Concept นี้ไปใส่ใน Script .... ดูเหมือน ผลลัพธ์ ของ Script จะทำงานได้ตามปกติ


ทำงานได้แล้ว จบ....
    ผลลัพธ์ ของ Script จะทำงานได้ตามปกติ    แต่ ผมเริ่มเกิดความรู้สึกหงุดหงิด.... Source Code ที่เข้าใจง่ายๆ เริ่มจะไม่ดูเรียบง่าย ไม่สวยงามเหมือนเดิม....

พระเจ้า สร้าง Linux มา แล้วทำไมไม่ทำให้ bash มันเปรียบเทียบ ตัวเลข Floating Point ได้ง่ายๆ กว่านี้ ฟ่ะ....  (พระเจ้า ตอบกลับมา.... กูไม่ได้สร้าง.... พวกมึง (มนุษย์) สร้างกันขึ้นมาเอง.... กูไม่เกี่ยว....)

เปรียบเทียบแค่ เลขทศนิยม ต้องไป เรียกใช้ expr + awk ....   อะไรกันนี้....   หรือ ผมเข้าใจอะไรผิด ????
( เดียวย้ายโปรแกรมไปเขียนบน C ดีกว่า ---->  เขียนแค่นี้ if  (fTodayPrice > fTomorrowPrice)  {....}  จบเลย.... )

ผู้ติดตาม

เกี่ยวกับฉัน

เพราะ ชีวิต คือ การลองผิด ลองถูก อย่างมี สติ + สัมปชัญญะ.... Trial & Error