basic-shell-script

การเขียน Shell Script

จากบทความก่อนหน้านี้ที่เราพูดกันถึง Unix, Linux, Kernel, Shell รวมถึง Shell Script ว่าคืออะไรกันไปแล้ว และ การเขียน Shell Script หละ ทำอย่างไร

คร่าวๆก็คือระบบปฎิบัติการ Unix หรือ Linux จะมีส่วนที่เป็น Kernel สำหรับเชื่อมต่อระหว่างส่วนเที่เป็น Hardware ในการบริหารจัดการทรัพยากร โดยตัวผู้ใช้งานสามารถสั่งการหรือใช้งานผ่านทาง Shell รวมถึงสามารถนำเอาคำสั่งใน Shell มาสร้างเป็น ชุดคำสั่งหรือ Shell Script ได้ เพื่อหาสามารถทำงานได้สะดวกขึ้น ที่นี้เรามีดูวิธีการเขียน Shell script กันต่อครับ

shell-kernel

 

ตัวอย่าง Shell มี่นิยมใช้เขียน Shell script

  • Bournr shell (/bin/sh) เป็น shell ในยุคแรกๆ ที่มีใช้กันอย่างแพร่หลาย มีการกำหนดโครงสร้างภาษาคล้ายๆ กับภาษาอัลกอ (Algo) สามารถเขียน shell script ได้ และยังเป็น starndard shell ที่มีใน UNIX ทุกตัว และยังสามารถย้าย shell script ไปยัง UNIX ระบบอื่นโดยไม่ต้องแก้ไขอะไรได้อีกด้วย จะมี default prompt เป็นเครื่องหมาย “ $ ”
  • C shell (/bin/csh) เป็น shell ที่พัฒนาขึ้นมาหลังจาก Bourne shell มีรูปแบบคำสั่งและไวยากรณ์เหมือนกับภาษา C มี function การทำงานหลายที่ดีและอย่างสะดวก อีกทั้งยังสามารถควบคุมการไหลของข้อมูลได้ดีกว่า Bourne shell และยังมีความสามารถในการเรียกใช้คำสั่งที่ใช้ไปแล้ว จะมี default prompt เป็นเครื่องหมาย “ % ”
  • Korn shell (/bin/ksh) เป็น shell ที่พัฒนามาจาดต้นแบบของ Bourne shell และ C shell สามารถทำงานใน function ของ Bourne shell ได้ทุกอย่าง การเขียน shell script ทำได้ง่ายและรัดกุมขึ้น  สามารถนำคำสั่งที่ใช้ไปแล้วกลับมา execute ไปใหม่ได้  ถือได้ว่า Korn shell เป็นการรวมเอาข้อดีของ Bourne shell  และ C shell มาไว้ด้วยกัน แต่ไม่ได้มีใน UNIX ทุกตัว จะมี default prompt เป็นเครื่องหมาย “ $ ”
  • Bournr again shell (/bin/bash หรือ /usr/local/bin/bash) เป็นการเอา Bournr shell นำกลับมาพัฒนาใหม่ สามารถทำงานแบบ line editing ได้ และยังได้เพิ่มประสิทธิภาพในการทำงานอีกหลายอย่าง bash shell นี้ไม่ใช่ standard UNIX shell แต่เป็น default shell ของ linux ในปัจจุบัน จะมี default prompt เป็นเครื่องหมาย “ $ ”

 

ขั้นตอนการเขียน Shell Script

  1. สร้าง file Shell script
  2. กำหนด interpreter หรือ shebang
  3. ใส่ชุดคำสั่ง command line
  4. กำหนดสิทธิ์ execute ให้กับ shell script
  5. การเรียกใช้งาน shell script (execute)
  6. การสร้างตัวแปรใน shell script (variable)
  7. การเรียกใช้งานตัวแปรใน shell script (variable)
  8. การใช้งานตัวแปร environment (environment variable)
  9. ตัวแปรแบบพิเศษ
  10. การ Comment
  11. ตัวแปรแถวลำดับ (array variable)
  12. รูปแบบเงื่อนไข (expression)
  13. เงื่อนไข if expression
  14. เงื่อนไข case switch
  15. การใช้ loop while
  16. การใช้ loop for
  17. การส่งค่า input argument

1. สร้าง file Shell script

Shell script เป็น file text ธรรมดาสามารถสร้างด้วย editor ชนิดไหนก็ได้ เช่น vi, nano, gedit,  emacs เป็นต้น

$ vi hello.sh

 

2. กำหนด interpreter หรือ shebang

บรรทัดแรกของ shell script เราต้องกำหนด shebang เพื่อให้ program รู้ว่าควรใช้ interpreter ใดในการ load ข้อมูล file ซึ่งสัญลักษณ์ที่ใช้คือ #!<shell program>

  • #!/bin/sh
  • #!/bin/csh
  • #!/bin/bash
  • #!/bin/ksh
  • #!/usr/bin/perl
  • #!/usr/bin/env python
#!/bin/bash
~
~

 

3. ใส่ชุดคำสั่ง command line

ส่วนนี้คือ code program ที่เราต้องการให้ shell script ทำงาน ซึ่งสามารถศึกษาชุดคำสั่ง Shell ของ Unix และ Linux ได้จากบทความนี้ รวมคำสั่ง Unix – Linux Command line พื้นฐานเบื้องต้น

ทำลองให้ shell script แสดงคำว่า “Hello World” ด้วยคำสั่ง echo  และลอง save file

#!/bin/bash

echo "Hello World"
~

 

4. กำหนดสิทธิ์ execute ให้กับ shell script

หลักจากเราสร้าง Shell script ขึ้นมาได้แล้ว ลองสังเกตุจะเห็นว่า file ที่ได้มีสิทธิ์ หรือ permission ของ user owner  (-rw-rw-r–) เพียงแค่ write กับ read เท่านั้น ไม่สามารถ execute ได้ ซึ่งก็ไม่ต่างกับ text file ธรรมดา

$ ls -ltr test.sh
-rw-rw-r-- 1 staff staff 32 May 13 15:28 test.sh

เราจึงต้องทำการเปลี่ยน permission ก่อนด้วยคำสั่ง chmod เพื่อให้เราสามารถ execute shell script ตัวนี้ได้

$ chmod 700 test.sh
$ ls -ltr test.sh
-rwx------ 1 staff staff 32 May 13 15:28 test.sh

ซึ่งเมื่อมีเครื่อง x แล้วนั้นหมายถึงเราสามารถ execute file นี้ได้แล้ว

 

5. การเรียกใช้งาน shell script (execute)

พิมพ์ fullpath ของ shell script หรือ ถ้าอยู่ใน directory ก็ใช้ ./<shell script> ลงที่ prompt ของ shell แล้ว enter จากนั้น program จะทำงานเป็นการ execute shell script ตั้งแต่บรรทัดแรกจนถึงบรรทัดสุดท้ายพร้อมกับแสดงผลลัพธ์ที่ได้ออกมาที่หน้าจอ screen จนจบและออกจาก program ให้เอง

$ ./test.sh 
Hello World

 

6. การสร้างตัวแปรใน shell script (variable)

เชลล์สคริปต์เหมือนกับโปรแกรมทั่วๆไปที่มีตัวแปรไว้เก็บค่าต่างๆ สำหรับใช้งาน ตัวแปรที่ใช้ในเชลล์นั้นไม่จำเป็นต้องประกาศชนิดตัวแปรเหมือนกับภาษา C  สามารถตั้งค่าแล้วนำไปใช้ได้ทันที

variable=value

*** ระวังเรื่อง space เพราะสำหรับ shell script แล้ว space คือการแบ่ง argument เพราะฉะนั้นห้ามมี space หน้าและหลัง “=” ซึ่งถ้าหากต้องการให้ค่าในตัวแปรมี space ให้ใช้ single quote (‘) หรือ double quote (“) ประกาศไว้หน้าและหลังคำที่ต้องการ

#!/bin/bash

var1=shell
var2=script
var3='shell script'
var4="shell script'

 

7. การเรียกใช้งานตัวแปรใน shell script (variable)

เวลาที่จะต้องการแสดงค่าให้ใช้เครื่อง”$” นำหน้าตัวแปร

#!/bin/bash

var1=shell
var2=script
var3='shell script'
var4="shell script'
var5='$var1 $var2'
var6="$var1 $var2"

echo $var1
echo $var2
echo $var3
echo $var4
echo $var5
echo $var6

ซึ่งเมื่อทำการรัน shell script จะเห็นความแต่ต่างระหว่างการใช้ single quote และ double quote คือ สิ่งที่พิมพ์ใน เครื่องหมาย Quote ( ‘ )  จะมีค่าตามสิ่งที่พิมพ์ ส่วนในเครื่องหมาย Double quote ( “ ) จะเป็นการอ้างอิงนำผลลัพธ์ที่ตัวแปรเก็บไว้หรือค่าที่ตัวแปรเก็บไว้มาใช้

$ ./test.sh
shell
script
shell script
shell script
$var1 $var2
shell script

 

8. การใช้งานตัวแปร environment (environment variable)

ตัวแปรที่ใช้ในเชลล์จะมีสองชนิดด้วยกัน คือ

  • ตัวแปรธรรมดา (variable)
  • ตัวแปรสภาพแวดล้อม (environment variable)

ตัวแปรสภาพแวดล้อมนั้นคล้ายกับตัวแปรธรรมดาแต่แตกต่างตรงที่ เมื่อโปรแกรมรันในเชลล์นั้น จะสืบทอดตัวแปรสภาพแวดล้อมและค่าที่อยู่ในตัวแปรสภาพแวดล้อมไปด้วย  เราสามารถสร้างตัวแปรธรรมดาให้เป็นตัวแปรสภาพแวดล้อมได้ โดยการใช้คำสั่ง export

#!/bin/bash

echo $NAME
~

เนื่องจากตัวแปร NAME ยังไม่มีการกำหนดค่า และ ไม่ได้เป็น environment variable จึงมีค่าเป็น null แต่ถ้าเรามีการ export ประกาศให้ NAME เป็น environment variable และ assign ค่าให้แล้ว จะทำการสืบทอดต่อไปยัง shell script ด้วย

 

$ ./test.sh

$
$ export NAME=saixiii
$ ./test.sh
saixiii

 

9. ตัวแปรแบบพิเศษ

เป็นตัวแปรที่ระบบ assign ค่าให้เอง ไม่ต้องประกาศค่าให้ ซึ่งส่วนใหญ่เป็นค่าที่เกี่ยวกับระบบ enviroment ของ shell script เอง ที่เราสามารถเอาไปใช้งานได้

  $0  $1  $2 ….    ใช้สำหรับอ้างอิงชื่อ shell script และ Argument ของ shell script  เรียกว่า position parameter
  $#   ใช้บอกจำนวน Argument ที่อยู่ใน shell script นั้นๆ
  $*   แทน Argument ของ script เรียงกันทั้งหมด
  $@   คล้ายกับ $* แต่จะใช้ช่องว่างคั่นระหว่าง position parameter
  $?   ใช้แสดงสถานการณ์จบการทำงานครั้งสุดท้าย ถ้าสั่งได้ถูกต้องไม่มี error จะแสดงค่า 0 ออกมา  แต่ถ้าผิดพลาดจะแสดงค่าที่ไม่ใช่ 0 ออกมา
  $!   ใช้แสดง process ID ของ shell ที่ทำงานอยู่

 

10. การ Comment

เครื่องหมาย  “ # ” ใช้แสดงหมายเหตุ เขียนไว้ตรงไหนใน Shell Script ก็ได้ (บรรทัดแรกใช้สำหรับ shebang) ใช้สำหรับการเขียนบันทึกใน script โดย shell จะถือว่าข้อความที่อยู่หลังเครื่องหมาย “ # ” เป็นหมายเหตุไม่มีผลต่อตัวโปรแกรม

 

#!/bin/bash

# Test Comment
var=hello
echo $var
$ ./test.sh
hello

จะเห็นได้ว่าข้อความที่อยู่หลังเครื่องหมาย “ # “ ไม่มีผลใดๆทั้งสิ้นเมื่อรันโปรแกรม เมื่อรันโปรแกรม โปรแกรมจะไม่แสดงข้อความที่ comment นั้นออกมา

 

11. ตัวแปรแถวลำดับ (array variable)

ตัวแปร array นั้นจะมี index เป็นตัวเลขเริ่มตั้งแต่ 0 เหมือนกับตัวแปรในภาษา C  หรือภาษาอื่นๆ  แต่เวลาที่ต้องการเรียกใช้ตัวแปรต้องใช้เครื่องหมาย “{  }”  ช่วยจับกลุ่มด้วย เพราะไม่เช่นนั้นค่าที่ออกมาจะออกมาเฉพาะค่าแรกเท่านั้น ดูได้จากตัวอย่าง

#!/bin/bash

txt[0]="a"
txt[1]="b"
txt[2]="c"

echo $txt[0] $txt[1] $txt[2]
echo ${txt[0]} ${txt[1]} ${txt[2]}
$ ./test.sh
a[0] a[1] a[2]
a b c

 

12. รูปแบบเงื่อนไข (expression)

เปรียบเทียบจำนวนเต็ม

เงื่อนไข ความหมาย
  int1 –eq int2   เป็นจริงเมื่อ int1 เท่ากับ int2
  int1 –ne int2   เป็นจริงเมื่อ int1 ไม่เท่ากับ int2
  int1 –gt int2   เป็นจริงเมื่อ int1 มากกว่า int2
  int1 –ge int2   เป็นจริงเมื่อ int1 มากกว่า หรือ เท่ากับ int2
  int1 –le int2   เป็นจริงเมื่อ int1 น้อยกว่า int2
  int1 –lt int2   เป็นจริงเมื่อ int1 น้อยกว่า หรือ เท่ากับ int2


เปรียบเทียบ string

เงื่อนไข ความหมาย
  str1 = str2   เป็นจริงเมื่อ str1 เหมือนกับ str2
  str1 != str2   เป็นจริงเมื่อ str1 ไม่เหมือนกับ str2
  Str   เป็นจริงเมื่อ str ไม่เป็นค่าว่าง
  -n str   เป็นจริงเมื่อ str มีความยาวมากกว่า 0
  -z str   เป็นจริงเมื่อ str มีความยาวเป็น 0


ตรวจสอบ file

เงื่อนไข ความหมาย
  -d filename   เป็นจริงเมื่อ filename เป็น directory
  -f filename   เป็นจริงเมื่อ filename เป็น file
  -r filename   เป็นจริงเมื่อ filename อ่านได้โดยโปรแกรม
  -w filename   เป็นจริงเมื่อ filename เขียนได้โดยโปรแกรม
  -x filename   เป็นจริงเมื่อ filename  run ได้โดยโปรแกรม
  -s filename   เป็นจริงเมื่อ filename มีขนาดไม่เป็น 0


เงื่อนไขอื่นๆ

เงื่อนไข ความหมาย
  !expr   เป็นจริงเมื่อ exp เป็นเท็จ
  exp1 –a exp2   เป็นจริงเมื่อ exp1 และ  exp2 เป็นจริง
  exp1 –o exp2   เป็นจริงเมื่อ exp1 หรือ  exp2 เป็นจริง

 

13. เงื่อนไข if expression

if [ expression ]
then
         commands
elif [ expression ]
then
         commands
else
         commands
fi

จากตัวอย่างต่อไปเป็นการเปรียบเทียบ ตัวแปร string

#!/bin/bash

var1="cat"
var2="cat"

if [ $var1 = $var2 ]
then
 echo "Yes, it is equal"
else
 echo "No, it is not equal"
fi
$ ./test.sh
Yes, it is equal

ในตัวอย่างแสดงการเปรียบเทียบตัวอักษรของตัวแปร text1 กับ text2  ว่าเหมือนกันหรือไม่ ถ้าเหมือนกันให้แสดงข้อความว่า  “ Yes,  it is  equal ”  หรือถ้าต่างกันให้แสดงข้อความว่า “ No, it is not equal ”  ทั้งนี้เงื่อนไข if จะมี หรือ ไม่มี  elif กับ else ก็ได้

 

14. เงื่อนไข case switch

คำสั่ง case เป็นคำสั่งที่ใช้ในการเปรียบเทียบเช่นเดียวกับคำสั่ง if แต่มีรูปการทำงานที่ต่างกัน

case string in
   str1)
         commands;;
   str2)
         commands;;
   str3)
         commands;;
   *)
         commands;;
esac

จากตัวอย่างใช้ switch มาเปรียบเทียบตัวแปร string

#!/bin/bash

var1="cat"

case $var1 in
 "ant")
 echo "It is an ant";;
 "bee")
 echo "It is an bee";;
 "cat")
 echo "It is an cat";;
 *)
 echo "I don't know";;
esac
$ ./test.sh
It is an cat

ในตัวอย่างแสดงการเปรียบเทียบตัวอักษรของตัวแปร text ว่าตรงกับ string ที่เป็นเงื่อนไขของ case หรือไม่  ถ้าเหมือนกันก็ให้แสดงข้อความที่ตั้งไว้ในเงื่อนไง

 

15. การใช้ loop while

คำสั่ง while เป็นคำสั่งที่ใช้ในการวนรอบการทำงานของโปรแกรม โปรแกรมจะวนรอบจนกว่าเงื่อนไขที่กำหนดไว้จะเป็นเท็จ

while [ expression ]
do
         commands
          ………….
done

ทำการสร้าง loop while ด้วยเงื่อนไขตัวเลข ที่มีการ incremental

#!/bin/bash

num=1

while [ $num -le 10 ]
do
 echo "Loop $num"
 ((num = $num+1))
done
$ ./test.sh
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
Loop 7
Loop 8
Loop 9
Loop 10

ในตัวอย่างเป็นการแสดงข้อความ “ Loop ” 10 บรรทัด  โดยให้ตัวแปร num มีค่าเป็น 1  ต่อจากนั้นก็เข้าสู่ loop while โดยมีเงื่อนไขว่า $num น้อยกว่าหรือเท่ากับ 10  loop while จะทำการแสดงข้อความ “ Loop ” โดยวนรอบการทำงานไปเรื่อยๆ และจะทำการเพิ่มค่า num ทีละ 1 ก่อนจะวนรอบใหม่ เมื่อโปรแกรมวน loop ครบตามเงื่อนไขแล้ว จะได้ผลลัพธ์เป็นการแสดงข้อความ “ Loop ” 10 บรรทัด

 

16. การใช้ loop for

คำสั่ง for เป็นคำสั่งที่มีการทำงานคล้ายคลึงกับ คำสั่ง while แต่จะต่างกันตรงที่การเขียนเงื่อนไขที่ใช้ในการวน loop

for  var  in  list
do
         commands
          ………….
done

ทำการสร้าง loop for โดยการนับจำนวนตาม list in

#!/bin/bash

for i in 1 2 3 4 5
do
 echo "Loop $i"
done
$ ./test.sh
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5

ในตัวอย่างเป็นการแสดงข้อความ “Loop ” ตามด้วยตัวเลข ในเงื่อนไข for นั้น “ i ” จะรับค่าตัวแปรที่อยู่หลัง “ in “  เข้ามาเก็บไว้ในตัวเอง ซึ่งตั้งไว้เป็น “ 1 2 3 4 5 “  มาทีละตัว ( จะใช้ช่องว่างในการแบ่งว่ามีกี่ตัว หรือกี่ argumentในเงื่อนไข )   loop for  จะทำการแสดงข้อความตามจำนวน argument ที่อยู่หลัง “ in ”  ซึ่งในโปรแกรมกำหนดเป็น “ 1 2 3 4 5 “ ซึ่งมีอยู่ห้าตัว โดยถูกแบ่งด้วยช่องว่าง เมื่อรันโปรแกรมแล้วจะเห็นได้ว่า ข้อความ “ Loop ” ตามด้วยจำนวนตัวเลข ถูกแสดงออกมา 5 บรรทัด โดยที่ตัวเลขนั้นมาจากตัวแปร “ $i ”   ที่อยู่ในบรรทัด echo  “Loop ”  $i  นั่นเอง

Loop for สามารถเขียนได้อีกอย่างหนึ่งดังนี้
for ((i=1;i<5;i++))
do
 echo "Loop $i"
done

 

17. การส่งค่า input argument

จากหัวข้อตัวแปรแบบพิเศษ เราสามารถนำเอาตัวแปรพวกนี้มาใช้แทนการรับค่า input argument ได้ เพื่อให้ shell script สามารถทำงานได้ตามสถานการณ์ที่เปลี่ยนแปลงไป

#!/bin/bash

var1=$1
var2=$2

echo "$1 & $2"
$ ./test.sh a b
a & b
$ ./test.sh "a c d" b
a c d & b

ผลลัพธ์จากตัวอย่างจะเห็นได้ว่า ค่า $1 แทนค่าได้เท่ากับ input argument แรก และ $2 แทนค่าได้เท่ากับ input argument ถัดไป ซึ่งแบ่งด้วย space และถ้าเราอยากให้ค่า space ติดเข้าไปกับตัวแปรด้วยให้ใช้ double quote ในการประกาศร่วมใน argument

 

 

Reference

 

Author: Suphakit Annoppornchai

Credit: https://saixiii.com

3 Thoughts to “การเขียน Shell Script เบื้องต้น หลักการทำงาน และ เงื่อนไขการใช้”

Leave a Reply