สรุปคอร์ส Introduction to Bash Shell Scripting ของ Coursera
Summary of Introduction to Bash Shell Scripting from Coursera
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (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
เป็น readablew
เป็น writablex
เป็น executable
ทีนี้เราสามารถใช้ man
ตามด้วย command เพื่อดู manual ได้ เช่น man ls
และใช้ q
เป็นการออกจาก manual
pwd
เป็นการเช็ค path ว่าตอนนี้เราอยู่ใน directory ไหน
cd
เป็นการเปลี่ยน directory เช่น cd /usr/bin
คือการเข้าไปใน directory ชื่อ /usr/bin
นั่นเอง และมีตัวอย่างอื่น ๆ สำหรับกรณีพิเศษแบบนี้
cd /
คือ ไปที่ root directorycd ..
คือ ขยับออกมาหนึ่งชั้น เช่น ถ้าเราอยู่ใน/usr/bin
ก็จะเป็น/usr
cd ~
คือ เปลี่ยนไปที่ home directorycd --
คือย้อนกลับไป 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_NAMEtar 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)
— — — — — — — — — — — — — — —