คล้ายกับชุด Unix Sed และ Unix Awk ที่กำลังดำเนินการอยู่ เราจะโพสต์บทความหลายบทความเกี่ยวกับสคริปต์ Bash ซึ่งจะครอบคลุมเทคนิคการเขียนสคริปต์ทุบตีทั้งหมดพร้อมตัวอย่างเชิงปฏิบัติ
เชลล์เป็นโปรแกรมที่แปลคำสั่งของผู้ใช้ ผู้ใช้ป้อนคำสั่งโดยตรงหรืออ่านจากไฟล์ที่เรียกว่าเชลล์สคริปต์
เชลล์เรียกว่าเป็นเชลล์แบบโต้ตอบ เมื่ออ่านอินพุตจากผู้ใช้โดยตรง
เชลล์ถูกเรียกเป็นเชลล์แบบไม่โต้ตอบ เมื่ออ่านคำสั่งจากไฟล์และดำเนินการ ในกรณีนี้ เชลล์จะอ่านไฟล์สคริปต์แต่ละบรรทัดจากบนลงล่าง และดำเนินการแต่ละคำสั่งเสมือนว่าผู้ใช้พิมพ์โดยตรง
พิมพ์ค่าของตัวแปรเชลล์ในตัว $- เพื่อดูว่าเชลล์เป็นแบบโต้ตอบหรือไม่โต้ตอบ
# echo $- himBH
หมายเหตุ:ตัวแปร $- มี “i” เมื่อเชลล์เป็นแบบโต้ตอบ .
Unix มี Shells ที่หลากหลาย บอร์นเชลล์ (sh), บอร์นเชลล์อีกครั้ง (bash), C เชลล์ (csh), Korn เชลล์ (ksh), Tenex C เชลล์ (tcsh) ใช้คำสั่ง which หรือ whereis unix เพื่อค้นหาตำแหน่งของเชลล์เฉพาะดังที่แสดงด้านล่าง
# which bash /bin/bash # whereis bash bash: /bin/bash /usr/share/man/man1/bash.1.gz
คุณสามารถสลับระหว่างเชลล์โดยพิมพ์ชื่อเชลล์ เช่น พิมพ์ csh เพื่อเปลี่ยนเป็น C เชลล์
การเขียนและการทำงานของเชลล์สคริปต์
ตัวอย่างที่ 1. สคริปต์ Hello World Bash
- สร้างสคริปต์โดยพิมพ์สองบรรทัดต่อไปนี้ลงในไฟล์โดยใช้โปรแกรมแก้ไขที่คุณชื่นชอบ
- คุณสามารถเลือกชื่อใดก็ได้สำหรับไฟล์ ชื่อไฟล์ไม่ควรเหมือนกับคำสั่งในตัวของ Unix
- สคริปต์จะเริ่มต้นด้วยอักขระสองตัว '#!' ซึ่งเรียกว่า she-bang เสมอ นี่เป็นการระบุว่าไฟล์นั้นเป็นสคริปต์ และควรดำเนินการโดยใช้ล่าม (/bin/bash) ที่ระบุโดยบรรทัดแรกที่เหลือในไฟล์
- ดำเนินการสคริปต์ดังที่แสดงด้านล่าง หากคุณมีปัญหาใดๆ ในการดำเนินการเชลล์สคริปต์ โปรดดูบทแนะนำการใช้งานเชลล์สคริปต์
- เมื่อคุณรันคำสั่ง "bash helloworld.sh" คำสั่งนี้จะเริ่มเชลล์ที่ไม่โต้ตอบและส่งผ่านชื่อไฟล์เป็นอาร์กิวเมนต์
- บรรทัดแรกจะบอกระบบปฏิบัติการว่าเชลล์ใดที่จะวางไข่เพื่อเรียกใช้สคริปต์
- ในตัวอย่างข้างต้น bash interpreter ซึ่งแปลสคริปต์และดำเนินการคำสั่งทีละตัวจากบนลงล่าง
- คุณสามารถรันสคริปต์ได้โดยไม่ต้องใช้ "bash" นำโดย:
- เปลี่ยนการอนุญาตบนสคริปต์เพื่อให้คุณ (ผู้ใช้) ดำเนินการได้โดยใช้คำสั่ง “chmod u+x helloworld.sh”
- ไดเรกทอรีที่มีสคริปต์ควรรวมอยู่ในตัวแปรสภาพแวดล้อม PATH หากไม่ได้รวมไว้ คุณสามารถเรียกใช้สคริปต์โดยระบุเส้นทางที่แน่นอนของสคริปต์
- echo เป็นคำสั่งที่ส่งออกอาร์กิวเมนต์ที่เรามอบให้ นอกจากนี้ยังใช้เพื่อพิมพ์ค่าของตัวแปร
$ cat helloworld.sh #!/bin/bash echo Hello World
$ bash helloworld.sh Hello World
ไฟล์ Bash-Startup
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ในลำดับการดำเนินการสำหรับ .bash_profile และบทความเกี่ยวกับไฟล์ที่เกี่ยวข้อง เมื่อเรียกใช้ bash เป็นเชลล์แบบโต้ตอบ อันดับแรกจะอ่านและดำเนินการคำสั่งจาก /etc/profile หากไม่มี /etc/profile มันจะอ่านและรันคำสั่งจาก ~/.bash_profile, ~/.bash_login และ ~/.profile ตามลำดับที่กำหนด อาจใช้อ็อพชัน –noprofile เมื่อเชลล์เริ่มทำงานเพื่อยับยั้งการทำงานนี้
โดยปกติ bash_profile ของคุณจะรัน ~/.bashrc หากต้องการคุณสามารถแสดงข้อความต้อนรับได้ สิ่งนี้จะทำงานเมื่อคุณเข้าสู่ระบบครั้งแรกเท่านั้น คุณสามารถส่งออกตัวแปรอะไรก็ได้ที่คุณต้องการ และคุณสามารถตั้งค่านามแฝงที่จะทำงานและพร้อมใช้งานเมื่อคุณเปิดเชลล์ เมื่อออกจากเชลล์การเข้าสู่ระบบ Bash จะอ่านและดำเนินการคำสั่งจากไฟล์ ~/.bash_logout
ตัวอย่าง 2. พิมพ์ข้อความต้อนรับเมื่อคุณเข้าสู่ระบบ
พิมพ์เนื้อหาต่อไปนี้ในไฟล์ bash_profile ของคุณ หากไม่มีไฟล์ ให้สร้างไฟล์ที่มีเนื้อหาด้านล่าง
$ cat ~/.bash_profile hname=`hostname` echo "Welcome on $hname."
เมื่อคุณลงชื่อเข้าใช้เชลล์แบบโต้ตอบ คุณจะเห็นข้อความต้อนรับดังที่แสดงด้านล่าง
login as: root root@dev-db's password: Welcome on dev-db
ตัวอย่าง 3. พิมพ์ข้อมูลที่เกี่ยวข้องกับระบบ
เมื่อคุณเข้าสู่ระบบเชลล์แบบโต้ตอบ คุณสามารถแสดงชื่อของเคอร์เนลที่ติดตั้งในเซิร์ฟเวอร์ เวอร์ชันทุบตี เวลาทำงาน และเวลาในเซิร์ฟเวอร์ได้
$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
เมื่อคุณเรียกใช้เชลล์แบบโต้ตอบ เชลล์จะพิมพ์ข้อความดังที่แสดงด้านล่าง
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. พิมพ์รายละเอียดการเข้าสู่ระบบล่าสุด
หากมีผู้ใช้หลายรายใช้เครื่องเดียวกันโดยใช้ข้อมูลเข้าสู่ระบบเดียวกัน รายละเอียดต่างๆ เช่น เครื่องที่เข้าสู่ระบบครั้งล่าสุด และเวลาที่พวกเขาเข้าสู่ระบบ จะเป็นรายละเอียดที่เป็นประโยชน์มากที่สุด ตัวอย่างนี้พิมพ์รายละเอียดการเข้าสู่ระบบล่าสุดในระหว่างการเริ่มต้นของเชลล์แบบโต้ตอบ
$ 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 : "; dateLastlog | grep "รูท" | awk {'print "การเข้าสู่ระบบครั้งล่าสุดจาก :"$3
print "Last Login Date &Time:",$4,$5,$6,$7,$8,$9;}'
ระหว่างการเริ่มต้น คุณจะได้รับข้อความดังที่แสดงด้านล่างlogin as: root root@dev-db's password: Welcome on dev-dbKernel 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เข้าระบบล่าสุดจาก :sasikala-laptop
Last Login Date &Time:อังคาร 22 ก.พ. 11:24:01 +0100 2010
ตัวอย่างที่ 5. ส่งออกตัวแปรและตั้งค่านามแฝงในระหว่างการเริ่มต้น
คำสั่งทั่วไปที่คุณจะใช้ในไฟล์ .bashrc และ .bash_profile คือคำสั่ง export และ alias
นามแฝงเป็นเพียงการแทนที่ข้อความหนึ่งกับอีกข้อความหนึ่ง เมื่อคุณเรียกใช้นามแฝง มันจะแทนที่สิ่งที่คุณพิมพ์ด้วยนามแฝงที่เท่ากับ ตัวอย่างเช่น หากคุณต้องการตั้งค่านามแฝงสำหรับคำสั่ง ls เพื่อแสดงรายการไฟล์/โฟลเดอร์ที่มีสี ให้ทำดังนี้:
alias ls 'ls --color=tty'หากคุณเพิ่มคำสั่งนี้ในไฟล์เริ่มต้น คุณสามารถดำเนินการคำสั่ง ls ซึ่งจะถูกแทนที่โดยอัตโนมัติด้วยคำสั่ง ls –color=tty
คำสั่งส่งออกใช้เพื่อตั้งค่าตัวแปรสภาพแวดล้อม ระบบหรือแอปพลิเคชันอื่นใช้ตัวแปรสภาพแวดล้อมต่างๆ เป็นเพียงวิธีการตั้งค่าพารามิเตอร์ที่แอปพลิเคชัน/สคริปต์ใดๆ สามารถอ่านได้ หากคุณตั้งค่าตัวแปรโดยไม่มีคำสั่ง export ตัวแปรนั้นจะมีอยู่เฉพาะสำหรับกระบวนการนั้นเท่านั้น
ในตัวอย่างด้านล่าง กำลังส่งออกตัวแปรสภาพแวดล้อม HISTSIZE บรรทัดที่ขึ้นต้นด้วย # คือบรรทัดแสดงความคิดเห็น
$ 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}