Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Bash Scripting: บทนำปฏิบัติพร้อม 5 ตัวอย่าง Real-World

คล้ายชุดบทความ 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

  1. สร้าง Script โดยพิมพ์ 2 บรรทัดต่อไปนี้ใน File ด้วย Editor ที่ชอบ
  2. $ cat helloworld.sh
    #!/bin/bash
    echo Hello World
  3. เลือกชื่อ File ใดๆ ได้ ชื่อ File ไม่ควรเหมือน Unix Built-in Commands
  4. Script เริ่มต้นด้วย 2 Character '#!' เรียกว่า She-bang เพื่อบอกว่า File นี้เป็น Script และควร Execute ด้วย Interpreter (/bin/bash) ที่ระบุในบรรทัดแรก
  5. Execute Script:
    $ bash helloworld.sh
        Hello World
  6. เมื่อ Execute "bash helloworld.sh" จะ Start Non-interactive Shell และส่ง Filename เป็น Argument
  7. บรรทัดแรกบอก OS ว่า Shell ไหนจะ Spawn เพื่อ Execute Script
  8. ในตัวอย่าง Bash Interpreter Interpret Script และ Execute Commands ทีละอันจากบนลงล่าง
  9. Execute Script ได้โดยไม่ต้องนำหน้าด้วย "bash" โดย:
    • Change Permission ให้ User Execute ได้: chmod u+x helloworld.sh
    • Directory ที่มี Script ควรอยู่ใน PATH Environment Variable ถ้าไม่ได้ Include ให้ Execute ด้วย Absolute Path
  10. echo เป็น Command ที่ Output Argument ที่ให้มา ใช้ Print ค่า Variable ด้วย

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}