Introduction
สวัสดีครับนักอ่านทุกท่าน ในบทความนี้ผมจะพานักอ่านทุกท่านมารู้จักกับการเขียนโปรแกรม Shell Script Unix (bash) ง่ายๆใน 10 นาที นะครับ ปกติแล้วเราก็มักจะเขียนโปรแกรมด้วยภาษา Python Java Kotlin และอื่นๆอีกมากมายใช่ไหมครับ แต่ว่าภาษา Shell Script ก็มีความสำคัญในการเขียนโปรแกรมให้กับระบบ OS หรือที่เรียกกันว่า Operation System นั่นเองครับ จะเป็นยังไงนั้นมาอ่านไปพร้อมๆกันเลยครับ
Requirements
- เครื่อง Mac OS สักเครื่อง เช่น Mac Book Pro , Mac Book Air
- เครื่องที่มีระบบปฏิบัติการ Linux เช่น Ubuntu
- สามารถใช้เว็บ GDB Online แล้วเลือกภาษาเป็น Bash โดยสามารถกดเข้าที่ลิงค์นี้ได้เลย
ขั้นตอนการเขียนโปรแกรม Shell Script
- เปิด terminal ขึ้นมาก่อน
- พิมพ์คำว่า bash ตามตัวอย่างด้านล่าง เพื่อเริ่มการเขียนโปรแกรม
bash
1. echo
มาเริ่มกันแบบง่ายๆก่อนกับคำสั่ง echo กันเลยครับ คำสั่ง echo เป็นคำสั่งที่เอาไว้แสดงข้อความออกทางจอภาพครับ มีวิธีใช้ง่ายๆ ดังนี้ครับ
- echo “ข้อความที่ต้องการแสดง”
echo "Hello World"
2. read -p ข้อความบอกผู้ใช้ var
เป็นการรับข้อความทาง keyboard จากผู้ใช้
read -p "Please input your name" username
คำอธิบาย
ถ้าเรารันคำสั่งข้างบนแล้ว จะเห็นข้อความ Please input your name แสดงออกทางจอภาพ แล้วถ้าผู้ใช้กรอกข้อความกลับมา ข้อความที่ผู้ใช้กรอกมาจะถูกเก็บลงในตัวแปร username
3. read -s -p ข้อความบอกผู้ใช้ var
เป็นการรับข้อความผ่านทาง keyboard จากผู้ใช้เหมือนข้อ 2 เลย แต่จะไม่ให้ผู้ใช้เห็นข้อความที่ตัวเองพิมพ์ลงไป คล้ายๆกรอก password จะเห็นเป็น **** นั่นแหละครับ
read -s -p "Please enter your password" pswd
คำอธิบาย
ถ้าเรารันคำสั่งข้างบนแล้ว จะเห็นข้อความ Please enter your password แสดงออกทางจอภาพ แล้วถ้าผู้ใช้กรอกข้อความกลับมา ข้อความที่ผู้ใช้กรอกมาจะถูกเก็บลงในตัวแปร pswd แต่ผู้ใช้จะไม่เห็นข้อความที่ตัวเองกรอก
ข้อควรระวัง : ในการเขียนโปรแกรม Shell Script ช่องว่าง ตัวใหญ่ ตัวเล็ก มีผลหมดนะครับ ให้ระวังด้วย
4. nano
คำสั่ง nano เป็นคำสั่งเอาไว้เปิด text editor ขึ้นมาแล้วเราสามารถเขียน code ในนั้นได้ แล้ว save เป็นไฟล์ .c กรณีเขียนโค้ดภาษา C หรือ .sh กรณีเขียนโค้ดเป็นภาษา bash script ถ้าต้องการรันให้ใช้คำสั่ง bash ตามด้วยชื่อไฟล์ที่จะรัน.sh
nano
ตัวอย่างการรัน
bash test.sh
5. การแสดงค่าที่ตัวแปรเก็บไว้ด้วย $
หากต้องการแสดงค่าที่เก็บเอาไว้ในตัวแปร สามารถใช้ $ นำหน้าตัวแปรได้
result=19
echo $result
ผลลัพธ์ก็จะได้ 19
6. การดำเนินการระหว่างตัวแปร
หากเราต้องการบวกเลขแล้วเนี่ย เราไม่สามารถเขียนธรรมดาแบบภาษาอื่นทั่วไปได้แบบ สมมุติว่าผมมีตัวแปร 2 ตัว คือ a=13,b=12 อยากเอา a กับ b มาบวกกันใช่ไหมครับ ถ้าเป็นในภาษา Python ผมก็แค่ print(a+b) ก็จบใช่ไหมครับ แต่ใน Bash Script ไม่สามารถทำได้ครับแบบนี้ ซึ่งวิธีการบวกเลขนั้น ทำได้โดยการ $(($a+$b)) ใส่ $ ไว้ข้างหน้าวงเล็บ 2 วงเล็บนะครับ ย้ำวงเล็บ 2 วงเล็บซ้อนกันนะครับ แล้วเอาค่าในตัวแปรของ a และ b มาบวกกัน
a=13
b=12
echo $(($a+$b))
7. การใช้งาน if else
เนื่องจากมันมีหลายเคส ผมจะยกตัวอย่างมาให้ดูเลยละกันครับ
ตัวอย่างการใช้งาน if then else
if [ "foo" = "foo" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi
ตัวอย่างการใช้งาน if then
if [ "foo" = "foo" ]; then
echo expression evaluated as true fi
ตัวอย่างการใช้งานร่วมกับตัวแปร
T1="foo" T2="bar" if [ "$T1" = "$T2" ]; then
echo expression evaluated as true else
echo expression evaluated as false fi
8. การประกาศ array
สามารถประกาศด้วยคำสั่งง่ายๆ declare -a ชื่ออารเรย์
declare -a square
ในที่นี้ square จะเป็นตัวแปรประเภท array
9. การประกาศฟังก์ชัน
function ex {
echo $1
}
ตัวอย่างการเรียกใช้และผลลัพธ์
ex "World"
>>> World
คำอธิบาย
ex เป็นชื่อฟังก์ชัน และเราโยน String ของคำว่า “World” เข้าไปในฟังก์ชัน แล้วฟังก์ชันจึงทำงาน โดยการนำ World ไปแทนที่ $1 (หมายถึง พารามิเตอร์ของฟังก์ชันตัวแรกที่ฟังก์ชันต้องไปรับมา เช่นกัน ถ้าเป็น $2 ก็ต้องหมายถึงพารามิเตอร์ตัวที่ 2 ที่ฟังก์ชันต้องไปรับมา) ผลลัพธ์จึงเป็นการปริ้นคำว่า World ออกทางหน้าจอนั่นเองครับ
10. While Loop
การใช้ while loop ก็จะแตกต่างกับภาษาอื่นิดหน่อย แต่แอบคล้ายภาษา C อยู่นะครับ ถ้าใครที่เคยเขียนภาษา C มาบ้างก็จะรู้ ส่วนใครไม่เคยก็ไม่เป็นไรครับ เรามาเริ่มต้นไปด้วยกัน โอเคงั้นเรามาเริ่มดู syntax กันเลย
Syntax
while [ expression ] do commands …………. done
ตัวอย่างการใช้งาน
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
11. For Loop
การใช้ for loop จะมี syntax คล้ายๆในภาษา Python มากเลยนะครับ มาลองดู
Syntax
for var in list do commands …………. done
ตัวอย่างการใช้งาน
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 นั่นเองครับ
13. การเขียนเงื่อนไขโดยใช้ตัวย่อใน Shell Script
เปรียบเทียบจำนวนเต็ม
เงื่อนไข | ความหมาย |
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 เป็นจริง |
14. การ Random ใน Shell Script
การ random นั้น ก็มี syntax ง่ายๆ โดยในที่นี้เราจะใช้คำสั่ง shuf ในการ random มาดู syntax กันเลยครับ
Syntax
$(shuf -i start-stop -n จำนวนเลขที่จะสุ่มออกมา)
ตัวอย่างการเรียกใช้งาน
rand=$(shuf -i 0-10 -n 1)
echo $rand
คำอธิบาย
จากตัวอย่างข้างบนเป็นการสุ่มเลขตั้งแต่เลข 0 ถึง 10 (0-10) เป็นจำนวน 1 ตัว นั่นเองครับ แล้ว assign ให้กับตัวแปร result เก็บไว้ จากนั้นปริ้นค่าที่เก็บไว้ในตัวแปร result ซึ่งก็คือค่าที่ได้จากการสุ่มออกมาทางหน้าจอด้วยคำสั่ง echo นั่นเองครับ
15. การใช้ square root ใน Shell Script
เนื้อหาตรงนี้อาจจะค่อนข้างทำความเข้าใจยากหน่อยนะครับ เนื่องจากการจะใช้ฟังก์ชันทางคณิตศาสตร์ใน shell ได้ จะต้องพึ่ง library awk นั่นเองครับ แล้วเราจำเป็นต้องใช้ pipeline ในการส่งค่าไปทำงานครับ มาดู syntax กันเลยดีกว่า
Syntax
$(echo "เลข" | awk '{print sqrt($1)}')
ตัวอย่างการใช้งาน
var=25
a=$(echo "$var" | awk '{print sqrt($1)}')
echo $a
echo $(echo "9" | awk '{print sqrt($1)}')
ผลลัพธ์การรัน
5
3
คำอธิบาย
$var เอาค่าในตัวแปร var ส่งต่อให้ $1 ($1 เป็น พารามิเตอร์ ของฟังก์ชัน) ผ่าน | หรือที่เรียกว่า pipeline นั่นเองครับ แล้วเอาไปหา sqrt (square root) แล้วส่งค่ากลับมาที่ตัวแปร a
16. เงื่อนไข Switch Case
คำสั่ง case เป็นคำสั่งที่ใช้ในการเปรียบเทียบเช่นเดียวกับคำสั่ง if แต่มีรูปการทำงานที่ต่างกัน โดยมี syntax ดังนี้
Syntax
case string in
str1)
commands;;
str2)
commands;;
str3)
commands;;
*)
commands;;
esac
ตัวอย่างการใช้ switch มาเปรียบเทียบตัวแปร string
var1="bee"
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 bee
ในตัวอย่างแสดงการเปรียบเทียบตัวอักษรของตัวแปร var1 ว่าตรงกับ String ที่เป็นเงื่อนไขของ case หรือไม่ ถ้าเหมือนกันก็ให้แสดงข้อความที่ตั้งไว้ในเงื่อนไง
17. Color echo ใน Shell Script
โอเคครับ ก็มาถึงหัวข้อสุดท้ายของวันนี้กันแล้วนะครับ ซึ่งในหัวข้อนี้ผมก็จะมาพานักอ่านทุกท่านแสดงผลข้อความ echo เป็นสีสันสวยงามนั่นเองครับ โดยมีวิธีใช้ ดังนี้
คำสั่ง | สีของข้อความ |
$(tput setaf 0) | สีดำ (Black) |
$(tput setaf 1) | สีแดง (Red) |
$(tput setaf 2) | สีเขียว (Green) |
$(tput setaf 3) | สีเหลือง (Yellow) |
$(tput setaf 4) | สีฟ้าเข้ม (Blue) |
$(tput setaf 5) | สีม่วงแดง (Magenta) |
$(tput setaf 6) | สีฟ้าน้ำทะเล (Cyan) |
$(tput setaf 7) | สีขาว (White) |
Note : จะต้อง Reset สีข้อความกลับไปเป็นสีเดิมทุกครั้งเมื่อ echo หรือปริ้นแล้ว
คำสั่ง reset สีเป็นสีปกติ
$(tput sgr 0)
ตัวอย่างการใช้งาน
echo "$(tput setaf เลขสี)ข้อความที่ต้องการปริ้น$(tput sgr 0)"
ผลลัพธ์การรัน
18. seq (เทียบเท่ากับ range ใน Python)
แถมให้อีกตัวกับคำสั่ง seq นั้นจะเป็นคำสั่งที่เอาไว้สร้างลิสต์ของตัวเลขใน shell script นั่นเองครับ ยกตัวอย่างเช่น ผมบอกว่า $(seq 0 7) ผมจะได้ [0 1 2 3 4 5 6 7] นั่นเอง ทีนี้มาดูตัวอย่างการใช้งานกันครับ
Syntax
$(seq start end)
ตัวอย่างการใช้งาน
for i in $(seq 0 7)
do
echo $(tput setaf $i)" $i Hello World"$(tput sgr 0)
done
ผลลัพธ์การรัน
สรุป
ก็จบกันไปแล้วนะครับกับบทความ เขียนโปรแกรม Shell Script Unix (Bash) ง่ายๆใน 10 นาที สำหรับใครที่อ่านจนจบเช่นเคยครับ ยินดีด้วยคุณไม่ต้องดูคลิป indian guy หรือพวกคนอินเดียสอนเขียน shell script แล้วครับ เพราะเนื้อหาที่ผมเอามาให้ทุกท่านอ่านทั้งหมดในวันนี้ ผมรวบรวมมาจากหลายแหล่ง รวมถึงคลิปสอนของชาวอินเดียบางคนด้วย สุดท้ายนี้ก็ขอขอบคุณนักอ่านทุกท่านที่แวะเข้ามาอ่านกันนะครับ แล้วเจอกันบทความหน้า สวัสดีครับ
References
https://linuxhint.com/30_bash_script_examples/