สรุปคอร์ส Introduction to Bash Shell Scripting ของ Coursera

Summary of Introduction to Bash Shell Scripting from Coursera

Nopnithi Khaokaew (Game)
4 min readJul 1, 2020

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

พอดีผมเห็นคอร์ส Introduction to Bash Shell Scripting ของ Coursera มันสั้นดีก็เลยตัดสินใจเรียนเพื่อ refresh ความรู้เรื่อง Linux Bash shell command กับ Bash script สักหน่อย

ในเมื่อเรียนทั้งทีก็เลยสรุปย่อเนื้อหามาไว้ในบทความนี้ซะเลย เผื่อจะเป็นประโยชน์แก่ท่านที่ผ่านเข้ามาบ้างไม่มากก็น้อย

Navigation

echo $SHELL สำหรับ echo นั้นเป็นการ print output ออกมาบน terminal

ls โชว์ list ของไฟล์ใน directory นั้น ๆ

ls -al = โชว์ list ของไฟล์โดย a คือ all ซึ่งจะโชว์ไฟล์ที่ถูกซ่อนอยู่ด้วย และ l คือ long listing format เป็นการแสดงรายละเอียดของไฟล์

ในส่วนของ drwxr-xr-x หรือ drwxr-xr-x อะไรประมาณนี้ในเบื้องต้นให้รู้ว่า

  • - เป็น file (เฉพาะตัวแรก/ตำแหน่งแรกเท่านั้น)
  • d เป็น directory (เฉพาะตัวแรก/ตำแหน่งแรกเท่านั้น)
  • r เป็น readable
  • w เป็น writable
  • x เป็น executable

ทีนี้เราสามารถใช้ man ตามด้วย command เพื่อดู manual ได้ เช่น man ls และใช้ q เป็นการออกจาก manual

pwd เป็นการเช็ค path ว่าตอนนี้เราอยู่ใน directory ไหน

cd เป็นการเปลี่ยน directory เช่น cd /usr/bin คือการเข้าไปใน directory ชื่อ /usr/bin นั่นเอง และมีตัวอย่างอื่น ๆ สำหรับกรณีพิเศษแบบนี้

  • cd / คือ ไปที่ root directory
  • cd ..คือ ขยับออกมาหนึ่งชั้น เช่น ถ้าเราอยู่ใน /usr/bin ก็จะเป็น /usr
  • cd ~ คือ เปลี่ยนไปที่ home directory
  • cd -- คือย้อนกลับไป directory ก่อนหน้า

Manipulating Files

touch myBashScript ใช้ในการสร้างไฟล์ ในที่นี้สร้างไฟล์ชื่อ myBashScript ขึ้นมา

mv myBashScript muchBetterName ที่จริงแล้ว mv คือ move ใช้สำหรับเคลื่อนย้ายไฟล์ แต่ในกรณีนี้จะเป็นการเปลี่ยนชื่อจาก myBashScript เป็น muchBetterName เพราะ muchBetterName มันไม่ใช่ directory (ก็ในเมื่อย้ายไปไม่ได้ก็เป็นการเปลี่ยนชื่อแทน)

rm muchBetterName เป็นการลบไฟล์

การดู Content ภายในไฟล์ Text

cat kingclear.txt คือการโชว์ content ทั้งหมดในไฟล์ text ชื่อ kingclear

เราสามารถโยกย้าย content จาก cat ไปสร้างเป็นไฟล์ใหม่ได้ด้วยการทำแบบนี้ cat kingclear.txt > myNetFile.txt แปลว่าเราจะได้ไฟล์ที่มี content เดียวกันในอีกชื่อหนึ่ง

ส่วน more myNewFile.txt ก็จะคล้ายกับ cat แต่จะสามารถค่อย ๆ ดูไปทีละ step ได้ด้วยการเคาะ spacebar ไปทีละดอก

และ less myNewFile.txt ก็ใช้ดู content เหมือนกัน แต่สามารถใช้ arrow key ในการเลื่อนขึ้นหรือลงได้ (more มันลงอย่างเดียว)

แน่นอนว่าทั้งสอง command ใช้ q ในการออก

การใช้ Text Editor อย่าง Nano เบื้องต้น

เมื่อเราใช้ nano myNewFile.txt ก็จะเปิดการเปิด text editor (ชื่อ nano) เพื่อแก้ไขไฟล์ หรือถ้าหากไฟล์ myNewFile.txt ยังไม่มีอยู่ก็จะสร้างขึ้นมาให้ด้วยเลย

ใน nano เราใช้ Ctrl + s เพื่อ save และ Ctrl + x เพื่อออก

Finding Information

การสร้างและลบ Directory

mkdir newDir เป็นการสร้าง directory ชื่อ newDir

mv newDir backups เปลี่ยนชื่อ directory เป็น backups

rmdir newDir ใช้ลบ directory ที่ไม่มีข้อมูลเท่านั้น

ถ้าหากจะลบ directory ที่มีข้อมูลมีหลายวิธี แต่วิธีที่ปลอดภัยสุดก็คือใช้ rm -ir backups โดย

  • -i คือให้โชว์ prompt ก่อนลบไฟล์
  • -r คือ recursive ทั้งหมดใน directory (วิ่งไล่ลบทุกไฟล์ภายใน directory)

การค้นหา Directory หรือไฟล์

find / -name "backups" เป็นการค้นหา “backups” ใน root directory แต่เมื่อรันเราจะเจอ error เพียบเพราะติด permission (ค้นหาได้บางส่วน)

อ้อ ใช้ Ctrl + C เพื่อ kill process ในการหาได้เสมอ

ถ้าไม่อยากเห็น error รกตาแถมอ่านก็ไม่ทัน ให้ใช้ find / -name "backups" 2>/dev/null แทน โดย 2>/dev/null จะเป็นการ redirect พวก error output ทั้งหมดไปที่ /dev/null ซึ่งมันก็จะถูกลบทิ้งอยู่ดี

ทีนี้เราสามารถใช้ * หรือ asterisk เพื่อเขียนเป็น pattern ในการค้นหาได้ เช่น find / -name "*backup*" 2>/dev/null นั่นก็คือค้นหาไฟล์หรือ directory ที่มีคำว่า backup อยู่ระหว่างคำว่าอะไรก็ได้ อาจจะเป็น mybackup, backupConfig หรือ mybackup_20200701 ก็ได้หมด

อีกตัวคือ grep เป็น command ในการบอกให้ shell ค้นหาด้วย regular expression เช่น grep python /usr/bin/pydoc ก็คือให้หาคำว่า python ในไฟล์ /usr/bin/pydoc

และเรายังเอา grep มาใช้ร่วมกับ | หรือ pipe ในการ filter output จาก command อื่น ๆ ได้ เช่น find / -name "*backup*" 2>/dev/null | grep $USER คือสุดท้ายเนี่ยมันจะหาไฟล์ที่มีคำว่า backup และเป็นของ user เราเอง (ถ้างงลองเล่นดูใน shell ตัวเองเลย)

การย้อนดู History ของ Command

!! เมื่อใช้ใน shell คือการรัน command ล่าสุดที่เราพึ่งใช้ไป

history คือดูรายการ command ที่เราเคยใช้ไปทั้งหมด ทีนี้ลองใช้ grep มา filter เฉพาะ command ที่เป็น cat เท่านั้นแบบนี้ history | grep cat ก็ได้

Aliases

ll ให้ผลลัพธ์ที่เหมือนกับ ls -l คือการดูรายละเอียดของไฟล์ทั้งหมด

ทีนี้มาลองสร้าง alias กัน โดยให้ใช้ nano .bash_aliases แล้วใส่ข้อมูลนี้ลงไป alias fbackup='find ~ -name "backup*" 2>/dev/null' ซึ่งหมายความว่าผมสามารถพิมพ์ fbackup (เสมือนเป็น Linux command) แล้วมันก็จะรัน find ~ -name "backup*" 2>/dev/null ออกมาให้ผม

แต่เมื่อลองใช้ fbackup จะ error เพราะ shell ไม่รู้จัก เนื่องจาก alias มันอยู่ที่ไฟล์ .bash_aliases ซึ่ง shell จะรันแค่ตอนที่เข้า terminal มา

ดังนั้นใช้ source .bash_aliases แล้วจะรัน fbackup ได้

Writing a Shell Script

ตัวอย่างการเขียน shell script ง่าย ๆ สมมุติว่าเป็นการ backup และส่ง email

nano myBackup แล้วใส่ข้อมูลดังนี้

#!/bin/bash
# myBackup: backup utility for dev directory

BACKUP_PATH="/home/nopnithi/dev/"
HOME_PATH="/home/nopnithi/"
DATE=`date +%d%m%Y`

BACKUP="backup_"
EXT=".tar"

FILE_NAME=$HOME_PATH$BACKUP$DATE$EXT
echo $FILE_NAME

แต่พอลองรัน Bash script ด้วย ./myBackup จะเจอ permisison denied

และเมื่อเช็คด้วย ll myBackup เพื่อดูรายละเอียดไฟล์ จะเห็นว่าเป็น -rw-rw-r-- หรือก็คือไฟล์นี้สามารถ read ได้และ write ได้ แต่ยัง execute ไม่ได้

การเปลี่ยน Permission

ถ้าเราต้องการเราสามารถ read, write และ execute ไฟล์นี้ได้ แต่สำหรับคนอื่นให้แค่ read และ execute เท่านั้น ก็ให้ทำแบบนี้

chmod u=rwx myBackup
chmod go=rx myBackup

จากข้างบน g คือ group และ o คือ others ซึ่งจะได้ permission แค่ read และ execute เท่านั้น ส่วนเราเอง (u) ได้ full access (read, write และ execute)

ทีนี้เราสามารถใช้ + หรือ - กับ chmod เพื่อลบหรือเพิ่ม permission ได้ เช่น chmod o-r myBackup ซึ่งเป็นการเอา read ออกจาก others

Bash Scripting and Creating a Cron Job With Crontab

กลับมาเขียน Bash script ต่อให้จบ โดยเพิ่มเงื่อนไขโดยใช้ if ว่าถ้าการ backup ของเราไม่มีปัญหาก็ให้ส่ง email แต่ถ้ามีก็เขียน error.log ซะ

จุดที่น่าสนใจคือ test -f "$FILE_NAME เป็น command ในการเช็คไฟล์ว่ามีอยู่หรือไม่

#!/bin/bash
# mybackup: backup utility for dev directory

BACKUP_PATH="/home/nopnithi/dev/"
HOME_PATH="/home/nopnithi/"
DATE=`date +%d%m%Y`

BACKUP="backup_"
EXT=".tar"

FILE_NAME=$HOME_PATH$BACKUP$DATE$EXT
#echo $FILE_NAME
tar cfz $FILE_NAME $BACKUP_PATHif test -f "$FILE_NAME"; then
echo "Here's your daily backup@" | mail -A $FILE_NAME -s "Today's Backup" nopnithi.k@gmail.com
else
echo $DATE " There was a problem creating the backup file." >> $HOME_PATH/error.log
fi

การใช้ Crontab ในการ Automate งานเป็น Schedule

crontab -l ใช้โชว์ job ทั้งหมด

crontab -e ใช้แก้ไข job

crontab -r ใช้ลบ contrab ทั้งหมดบน account เรา

การเขียน schedule เพื่อรัน script หรือ command แบบนี้

0 2 * * * /home/rhyme/myBackup
* * * * * /path/to/script

ให้อ่านเอาที่นี่ละกันครับเพราะในคอร์สไม่ได้สอนเอาไว้

https://opensource.com/article/17/11/how-use-cron-linux

การใช้ Shortcut ใน Crontab สำหรับกำหนด Schedule แบบง่าย ๆ

@yearly /path/to/job
@annually /path/to/job
@monthly /path/to/job@weekly /path/to/job@daily /path/to/job
@midnight /path/to/job
@hourly /path/to/job@reboot /path/to/job

สำหรับความหมายก็ให้แปลตรงตัวได้เลย ซึ่ง shortcut มันก็คือการกำหนด schedule ของ job ให้รัน ทุกปี ทุกเดือน ทุกวัน อะไรแบบนี้ ใช้แทนการเขียนใน format นี้ * * * * * เพื่อความสะดวกนั่นเอง

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.