บทความนี้อยู่ในกลุ่มของบทความสอนเขียน shell script ซึ่ง shell script ที่จะสอนนั้นจะใช้ bash เป็น intepreter หรือตัวแปลภาษาครับ

จากบทความ ตอนที่ 1  ผมได้จำแนกข้อมูลใน bash ตามค่าของข้อมูลแบ่งออกเป็น 3 กลุ่มคือ  ตัวเลข ข้อความ และอาเรย์ ในบทความนี้ผมจะได้กล่าวถึงการดำเนินการกับตัวแปรหรือข้อมูลในกลุ่มต่าง ๆ ครับ

1 .การดำเนินการกับตัวเลข

bash มีข้อจำกัดในการประมวลผลกับตัวเลขที่เป็นจำนวนเต็มและเป็นการคำนวณง่าย ๆ เท่านั้น ส่วนการประมวลผลตัวเลขที่เป็นจำนวนจริง(ทศนิยม) ไม่สามารถประมวลผลได้โดยตรงรวมถึงการประมวลผลทางคณิตศาสตร์ที่ซับซ้อน แนวทางแก้ไขปัญหานี้คือการใช้งานร่วมกับโปรแกรม  bc  ผ่านกระบวนการ pipeline (ผู้เขียนขอข้ามส่วนนี้ไปก่อน และจะได้กล่าวถึงในบทความถัดไป ) ในที่นี้จะขอกล่าวถึงการประมวลผลตัวเลขที่เป็นจำนวนเต็มเท่านั้น

1.1  การดำเนินการภายใต้เครื่องหมาย Arithemtic Expansion(AE) :  $(( ))
bash จะประมวลผลคำสั่งในเครื่องหมาย AE  โดยมองว่าข้อมูลข้างในเป็นการคำนวณทางคณิตศาสตร์ โดยตัวแปรที่นำมาใช้ภายใต้ AE นั้นสามารถละเครื่องหมาย $ ได้ โดยโอเปอเรชั่นทางคณิตศาสตร์ใน AE นั้นจะคล้ายๆกับ โอเปอเรชั่นทั่วไปในภาษาโปรแกรมอื่น ดังนี้

  • var++ , var–  ,++var, –var     การทำ post-increment  post-decrement  pre-increment และ pre-decrement ตามลำดับ
  • +  –  *  /  %   เครื่องหมายการบวก  การลบ  การคูณ การหาร(ไม่เก็บเศษ) และการหารเก็บเฉพาะเศษ(modulo) ตามลำดับ
  • **  เครื่องหมายยกกำลัง
  • =  +=  -=  *=  /=  %=   การกำหนดค่า การกำหนดค่าหลังจากการบวก ลบ คูณ หาร หารเก็บเศษ ตามลำดับ
  • >>  <<  การเลื่อนบิตขวาและซ้าย ตามลำดับ

ในการใช้สัญลักษณ์ AE เมื่อไม่มีการรีเทิร์นค่าจาก AE ให้ละเครื่องหมาย $

ตัวอย่างการใช้งาน AE

$ a=10  b=20
$ echo $a+$b
10+20
$ echo $((a+b))
30
$ echo $((a**3))
1000
$ echo $(( -b+2*a ))
0
$ (( a++ ))
$ echo $a
11

1.2 การใช้คำสั่ง let
ใน bash จะมีคำสั่งที่เป็น built-in ที่ชื่อ let ซึ่งจะใช้สำหรับจัดการประมวลผลทางคณิตศาสตร์เช่นเดียวกับ AE แต่จะดูง่ายต่อการอ่านมากกว่า การใช้ AE ครับ  ตัวแปรที่ตามหลังคำสั่ง let สามารถละเครื่องหมาย $ ได้เช่นเดียวกัน

ตัวอย่างการใช้คำสั่ง let

$ a=10 b=20
$ let c=b/a
$ echo “$b/$a=$c
20/10=2

2. การดำเนินการกับข้อความ

ข้อความหรือ string ใน bash นั้นถือว่าเป็นข้อมูลพื้นฐาน เนื่องจากข้อมูลส่วนใหญ่ที่เขียนในสคริปต์มักจะอ้างอิงเป็นชื่อโปรแกรมหรือพารามิเตอร์ ซึ่ง bash ได้ให้ความสำคัญกับการจัดการกับข้อมูลชนิดข้อความ มากกว่าการจัดการกับการประมวลผลทางคณิตศาสตร์ครับ

2.1ขนาดของข้อความ

${#string}

ตัวอย่าง
$ a=”Wayne Rooney is a world class footballer.”
$ echo ${#a}
41
$ a=
$ echo ${#a}
0

2.2 การตัดคำ

${string:position}
การตัดคำจากข้อความ string โดยเริ่มจากตำแหน่ง position ที่กำหนด

${string:position:length}
การตัดคำจากข้อความ string โดยเริ่มจากตำแหน่ง position ที่กำหนด โดยระบุความยาวของตัวอักษร

ตัวอย่าง

$ a=”Sir Alex Ferguson”
$ echo ${a:4}
Alex Ferguson
$ echo ${a:4:4}
Alex

2.3 การตัดคำด้วยข้อความ

${string#substring}
ตัดคำด้วยข้อความที่อยู่ด้านหน้า substring  ถ้าใช้ regular expression จะตัดคำโดยใช้รูปแบบที่เข้ากับ pattern ในแบบสั้นที่สุด

${string##substring}
ตัดคำด้วยข้อความที่อยู่ด้านหน้า substring  ถ้าใช้ regular expression จะตัดคำโดยใช้รูปแบบที่เข้ากับ pattern ในแบบยาวที่สุด

${string%substring}
ตัดคำด้วยข้อความที่อยู่ด้านหลัง substring  ถ้าใช้ regular expression จะตัดคำโดยใช้รูปแบบที่เข้ากับ pattern ในแบบสั้นที่สุด

${string%%substring}
ตัดคำด้วยข้อความที่อยู่ด้านหลัง substring  ถ้าใช้ regular expression จะตัดคำโดยใช้รูปแบบที่เข้ากับ pattern ในแบบยาวที่สุด

ตัวอย่าง
$ a=”Dimitar Berbatov”
echo ${a#Dimitar}
Berbatov
echo ${a##Dimitar}
Berbatov
echo ${a#D*r}    #—>   ใช้ #D*r จะ match กับคำว่า Dimitar
Berbatov
echo ${a##D*r} #—>  ใช้  ##D*r จะ match กับคำว่า Dimitar Ber
batov
echo ${a%a*}    #—>   ใช้ %a* จะ match กับคำว่า atov
Dimitar Berb
echo ${a%%a**} #—>  ใช้ %%a* จะ match กับคำว่า ar Berbatov
Dimit

2.4 การค้นหาและแทนที่ข้อความ

${string/substring/replacement}
แทนที่ข้อความตัวแรกที่ match กับค่าของ substring ด้วยค่าของ replacement

${string//substring/replacement}
แทนที่ข้อความทุกตัวที่ match กับค่าของ substring ทุกตัวด้วยค่าของ replacement

${string/#substring/replacement}
ถ้าคำขึ้นต้นของข้อความ  match กับค่าของ substring จะแทนที่ข้อความนั้นด้วยค่า replacement

${string/%substring/replacement}
ถ้าคำลงท้ายของข้อความ  match กับค่าของ substring จะแทนที่ข้อความนั้นด้วยค่า replacement

ตัวอย่าง
$ a=”man who is not a man”
$ echo ${a/man/girl}
girl who is not a man

$ echo ${a//man/girl}
girl who is not a girl

$ echo ${a/#man/girl}
girl who is not a man

$ echo ${a/%man/girl}
man who is not a girl

Advertisements

2 คิดบน “สอนเขียน shell script ตอนที่ 2 การดำเนินการกับข้อมูล

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s