คล้ายชุดบทความ Unix Sed และ Unix Awk ต่อเนื่อง เราจะโพสต์บทความหลายๆ บทความเกี่ยวกับ Bash Scripting ซึ่งจะครอบคลุม Bash Scripting Techniques ทั้งหมดพร้อมตัวอย่างปฏิบัติ
Shell คือ Program ที่ Interpret User Commands Commands อาจเป็นที่พิมพ์โดย User โดยตรง หรืออ่านจาก File ที่เรียกว่า Shell Script
Shell เรียกว่า Interactive Shell เมื่ออ่าน Input จาก User โดยตรง
Shell เรียกว่า Non-interactive Shell เมื่ออ่าน Commands จาก File และ Execute มัน ในกรณีนี้ Shell อ่านแต่ละบรรทัดของ Script File จากบนลงล่าง และ Execute แต่ละ Command กับเหมือนพิมพ์โดย User โดยตรง
Print ค่าของ Built-in Shell Variable $- เพื่อรู้ว่า Shell เป็น Interactive หรือ Non-interactive
# echo $- himBH
Note: $- Variable มี "i" เมื่อ Shell เป็น Interactive
Unix มี Shell หลากหลาย Bourne Shell (sh), Bourne Again Shell (bash), C Shell (csh), Korn Shell (ksh), Tenex C Shell (tcsh) ใช้ which หรือ whereis Unix Commands หา Location ของ Shell เฉพาะ
# which bash /bin/bash # whereis bash bash: /bin/bash /usr/share/man/man1/bash.1.gz
Switch ระหว่าง Shells ได้โดยพิมพ์ Shell Name เช่น พิมพ์ csh เพื่อ Switch ไป C Shell
Writing และ Execution ของ Shell Script
ตัวอย่าง 1. Hello World Bash Script
- สร้าง Script โดยพิมพ์ 2 บรรทัดต่อไปนี้ใน File ด้วย Editor ที่ชอบ
- เลือกชื่อ File ใดๆ ได้ ชื่อ File ไม่ควรเหมือน Unix Built-in Commands
- Script เริ่มต้นด้วย 2 Character
'#!'เรียกว่า She-bang เพื่อบอกว่า File นี้เป็น Script และควร Execute ด้วย Interpreter (/bin/bash) ที่ระบุในบรรทัดแรก - Execute Script:
$ bash helloworld.sh Hello World - เมื่อ Execute
"bash helloworld.sh"จะ Start Non-interactive Shell และส่ง Filename เป็น Argument - บรรทัดแรกบอก OS ว่า Shell ไหนจะ Spawn เพื่อ Execute Script
- ในตัวอย่าง Bash Interpreter Interpret Script และ Execute Commands ทีละอันจากบนลงล่าง
- Execute Script ได้โดยไม่ต้องนำหน้าด้วย "bash" โดย:
- Change Permission ให้ User Execute ได้:
chmod u+x helloworld.sh - Directory ที่มี Script ควรอยู่ใน PATH Environment Variable ถ้าไม่ได้ Include ให้ Execute ด้วย Absolute Path
- Change Permission ให้ User Execute ได้:
echoเป็น Command ที่ Output Argument ที่ให้มา ใช้ Print ค่า Variable ด้วย
$ cat helloworld.sh #!/bin/bash echo Hello World
Bash-Startup Files
เหมือนที่พูดใน Execution Sequence สำหรับ .bash_profile และไฟล์เกี่ยวข้อง เมื่อ Bash ถูก Invoke เป็น Interactive Shell มันจะอ่านและ Execute Commands จาก /etc/profile ก่อน ถ้า /etc/profile ไม่มี จะอ่านและ Execute จาก ~/.bash_profile, ~/.bash_login และ ~/.profile ตามลำดับ Option --noprofile ใช้ตอน Start Shell เพื่อ Inhibit พฤติกรรมนี้
โดยปกติ Bash_profile Execute ~/.bashrc ถ้าชอบสามารถแสดง Welcome Message ได้ Runs เฉพาะตอน Login ครั้งแรก Export Variables ที่ต้องการ และ Set Aliases ที่จะรันและ Available ตอนเปิด Shell เมื่อ Login Shell Exit Bash อ่านและ Execute Commands จาก ~/.bash_logout
ตัวอย่าง 2. พิมพ์ Welcome Message ตอน Login
พิมพ์เนื้อหาต่อไปนี้ใน bash_profile File ถ้า File ไม่มี ให้สร้าง File ใหม่
$ cat ~/.bash_profile hname=`hostname` echo "Welcome on $hname."
Login Interactive Shell จะเห็น Welcome Message:
login as: root root@dev-db's password: Welcome on dev-db
ตัวอย่าง 3. พิมพ์ System Related Information
Login Interactive Shell แสดง Kernel Name, Bash Version, Uptime และ Server Time
$cat ~/.bash_profile hname=`hostname` echo "Welcome on $hname." echo -e "Kernel Details: " `uname -smr` echo -e "`bash --version`" echo -ne "Uptime: "; uptime echo -ne "Server time : "; date
Launch Interactive Shell จะพิมพ์ข้อความ:
login as: root root@dev-db's password: Welcome on dev-db Kernel Information: Linux 2.6.18-128 x86_64 GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. Uptime: 11:24:01 up 21 days, 13:15, 3 users, load average: 0.08, 0.18, 0.11 Server time : Tue Feb 22 11:24:01 CET 2010
ตัวอย่าง 4. พิมพ์ Last Login Details
ถ้า Multiple Users ใช้ Machine เดียวกับ Login เดียวกัน Details เช่น Machine ที่ Last Login เกิดขึ้น และ Time ที่ Login จะเป็น Details ที่มีประโยชน์ที่สุด ตัวอย่างนี้พิมพ์ Last Login Details ระหว่าง Startup Interactive Shell
$ cat ~/.bash_profile
hname=`hostname`
echo "Welcome on $hname."
echo -e "Kernel Details: " `uname -smr`
echo -e "`bash --version`"
echo -ne "Uptime: "; uptime
echo -ne "Server time : "; date
lastlog | grep "root" | awk {'print "Last login from : "$3
print "Last Login Date & Time: ",$4,$5,$6,$7,$8,$9;}'
ตอน Startup จะได้ Message:
login as: root root@dev-db's password: Welcome on dev-db Kernel Information: Linux 2.6.18-128 x86_64 GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. Uptime: 11:24:01 up 21 days, 13:15, 3 users, load average: 0.08, 0.18, 0.11 Server time : Tue Feb 22 11:24:01 CET 2010 Last login from : sasikala-laptop Last Login Date & Time: Tue Feb 22 11:24:01 +0100 2010
ตัวอย่าง 5. Export Variables และ Set Aliases ระหว่าง Start-up
Commands ที่พบบ่อยใน .bashrc และ .bash_profile คือ Export และ Alias Command
Alias คือการแทนที่ Text หนึ่งด้วยอีก Text หนึ่ง ตอน Run Alias มันแค่ Replace สิ่งที่พิมพ์ด้วยสิ่งที่ Alias เท่ากับ เช่น ต้องการ Set Alias สำหรับ ls Command ให้ List Files/Folders ด้วย Colors:
alias ls 'ls --color=tty'
ถ้า Add Command นี้ใน Startup File ใดๆ สามารถ Execute ls Command ได้ โดยจะ Auto Replace ด้วย ls --color=tty
Export Command ใช้ Set Environment Variable Environment Variables ต่างๆ ถูกใช้โดย System หรือ Applications อื่นๆ มันคือวิธีตั้ง Parameters ที่ Application/Script ใดๆ อ่านได้ ถ้า Set Variable โดยไม่มี Export Command Variable นั้นจะมีอยู่แค่ Process นั้นๆ
ในตัวอย่างด้านล่าง Export Environment Variable HISTSIZE บรรทัดเริ่มด้วย # คือ Comment Line
$ cat /etc/profile
alias ls 'ls --color=tty'
# Setup some environment variables.
export HISTSIZE=1000
PATH=$PATH:$HOME/bin:/usr/bin:/bin/usr:/sbin/etc
export PATH
export SVN_SH=${SVN_RSH-ssh}