See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Bash - วิกิพีเดีย

Bash

จากวิกิพีเดีย สารานุกรมเสรี

บทความนี้มีชื่อเป็นภาษาอังกฤษ เนื่องจากยังไม่มีชื่อภาษาไทยที่กระชับ เหมาะสม หรือไม่รู้วิธีอ่านในภาษาไทย
ชื่อที่ถูกต้องของบทความนี้คือ bash ชื่อที่แสดงไม่ถูกต้องเนื่องจากข้อจำกัดทางเทคนิค
GNU Bourne-Again SHell

ผู้พัฒนา: เช็ต เรมี
รุ่นล่าสุด: 3.1 / 7 ธันวาคม พ.ศ. 2548
ระบบปฏิบัติการ: ลีนุกซ์, แมคโอเอสเท็น, ยูนิกซ์, ไมโครซอฟท์วินโดวส์ (ผ่านทาง Cygwin)
ประเภท: เชลล์ยูนิกซ์
ลิขสิทธิ์: GPL
เว็บไซต์: เว็บเพจของ GNU Bash

bash เป็นเชลล์ยูนิกซ์ที่พัฒนาขึ้นสำหรับโครงการกนู ชื่อนี้ย่อมาจาก Bourne-Again SHell ซึ่งเป็นการล้อเลียนโปรแกรมเชลล์อีกตัวคือ บอร์นเชลล์ (Bourne shell) Bash เขียนมาใช้แทนบอร์นเชลล์ซึ่งเขียนขึ้นสำหรับยูนิกซ์เวอร์ชัน 7 โดย สตีเฟน บอร์น (Stephen Bourne) เมื่อประมาณ ค.ศ. 1978 ไบรอัน ฟอกซ์ (Brian Fox) เขียนเชลล์ bash ไว้เมื่อ ค.ศ. 1987 ตั้งแต่ ค.ศ. 1990 เป็นต้นมาผู้ดูแลพัฒนาหลักคือ เช็ต เรมี (Chet Ramey)[1]}} ในลีนุกซ์ส่วนใหญ่และในแมคโอเอสเท็นใช้ bash เป็นเชลล์มาตรฐาน bash สามารถทำงานบนระบบปฏิบัติการยูนิกซ์และใกล้เคียง ยังปรับปรุงให้สามารถทำงานในไมโครซอฟท์วินโดวส์โดยโครงการ Cygwin และในดอสโดยโครงการ DJGPP ด้วย

เนื้อหา

[แก้] รูปแบบคำสั่ง

รูปแบบคำสั่งของ bash ครอบคลุมคำสั่งทั้งหมดของบอร์นเชลล์ ดังนั้นสคริปต์ที่เขียนสำหรับบอร์นเชลล์ส่วนใหญ่จึงสามารถรันใน bash ได้โดยไม่ต้องแก้ไข จะมียกเว้นก็เช่น สคริปต์ที่เรียกใช้ตัวแปรพิเศษในบอร์นเชลล์ หรือใช้คำสั่งภายในของบอร์นเชลล์

รูปแบบคำสั่งใน bash ยังได้รับแนวความคิดจาก คอร์นเชลล์ (ksh) และ C เชลล์ (csh) เช่น การแก้ไขคำสั่ง จำคำสั่งเก่า ตัวแปร $RANDOM และ $PPID เป็นต้น เวลาใช้เป็นเชลล์ทางคอมมานด์ไลน์ bash จะเติมชื่อโปรแกรม ชื่อไฟล์ ชื่อตัวแปร ให้ครบโดยอัตโนมัต เมื่อผู้ใช้กดปุ่ม TAB

ต่อไปนี้เป็นตัวอย่างรูปแบบคำสั่งที่เพิ่มเติมมาใน bash ที่ Bourne shell ไม่มี

[แก้] การคำนวณเลขจำนวนเต็ม

bash สามารถคำนวณตัวเลขจำนวนเต็มโดยไม่ต้องเรียกใช้โปรแกรมอื่น ในการคำนวณจะใช้คำสั่ง ((...)) หรือ $[...]

VAR=55            # กำหนดค่า 55 ให้กับตัวแปร VAR
((VAR = VAR + 1))   # บวกหนึ่งให้ตัวแปร VAR สังเกตว่าไม่ใช้อักษร '$'
((++VAR))              # อีกวิธีในการบวกหนึ่งให้กับ VAR
((VAR++))              # อีกวิธีในการบวกหนึ่งให้กับ VAR
echo $[VAR * 22]     # นำ VAR ไปคูณกับ 22 แล้วแทนที่ในคำสั่ง
echo $((VAR * 22))   # อีกวิธีในการนำ VAR ไปคูณกับ 22 แล้วแทนที่ในคำสั่ง

คำสั่ง ((...)) ยังใช้ในการตรวจสอบเงื่อนไข ว่าเป็นจริงหรือเท็จ เช่น

if ((VAR == Y * 3 + X * 2))
then
        echo Yes
fi

((Z > 23)) && echo Yes

สามารถใช้เงื่อนไข '==', '!=', '>', '<', '>=' และ '<=' ในคำสั่ง ((...))

bash ไม่สามารถคำนวณค่าเป็นจำนวนทศนิยมได้ มีเพียง คอร์นเชลล์ และ Z เชลล์ เท่านั้นที่ทำได้

[แก้] เปลี่ยนทิศทาง I/O

bash มีรูปแบบคำสั่งหลายอย่างในการเปลี่ยนทิศทาง I/O ตัวอย่างเช่น ถ้าต้องการเปลี่ยน standard output (stdout) และ standard error (stderr) ไปเก็บในไฟล์ สามารถใช้รูปแบบ

command &> file

ซึ่งง่ายกว่าบอร์นเชลล์ที่ต้องพิมพ์ "command > file 2>&1"

ตั้งแต่รุ่น 2.05b เป็นต้นมา bash สามารถดึงข้อความสตริงไปเข้า standard input (เรียกว่า "here documents" หรือ "heredocs") ได้ดังนี้

command << "สตริงที่ส่งไป standard input"

ถ้าในสตริงมีตัวอักษรช่องว่าง หรือตัวอักษรพิเศษอื่น ๆ ต้องใส่สตริงในเครื่องหมายคำพูด

ตัวอย่าง: Redirect standard output to a file, write data, close file, reset stdout

# สร้างไฟล์เดสคริปเทอร์ (Filedescriptor, FD) 6 ให้ชี้ไปยัง stdout (FD 1)
exec 6>&1
# เปลี่ยน stdout ให้เขียนลงไฟล์ "test.data" แทน
exec 1>test.data
# ใส่ข้อมูลในไฟล์
echo "data:data:data"
# ปิดไฟล์ "test.data"
exec 1>&-
# เปลี่ยน stdout ให้เหมือนกับ FD 6 (รีเซต stdout ให้กลับเหมือนเดิม)
exec 1>&6
# ปิด FD6
exec 6>&-

เปิดและปิดไฟล์

# เปิดไฟล์ test.data เพื่ออ่าน ใช้ FD 6
exec 6<test.data
# อ่านจนกว่าจะจบไฟล์
while read -u 6 dta
do
  echo "$dta" 
done
# ปิดไฟล์ test.data
exec 6<&-

เก็บผลลัพธ์ของคำสั่งภายนอก

 # รันโปรแกรม 'find' และเก็บผลลัพธ์ไว้ในตัวแปร VAR
 # ค้นหาไฟล์ที่ลงท้ายด้วยตัวอักษร "h"
 VAR=$(find . -name "*h")

[แก้] การตรวจสอบ regular expressions

bash 3.0 สนับสนุนการตรวจสอบ regular expression ในตัว bash เองโดยใช้รูปแบบคำสั่งที่คล้ายกับภาษาเพิร์ลดังนี้

[[string =~ regex]]

รูปแบบของ regular expression จะเหมือนกับที่กำหนดในหน้าแมนเพจ regex(7) ผลลัพธ์ที่ได้จะเป็น 0 ถ้า string ตรงกับ string และ 1 ถ้าไม่ตรงกัน ข้อความในวงเล็บภายใน regular expression สามารถอ่านได้จากตัวแปร BASH_REMATCH ดังต่อไปนี้

if [[abcfoobarbletch =~ 'foo(bar)bl(.*)']]
then
        echo ข้อความตรงกับที่ค้นหา\!
        echo $BASH_REMATCH      -- แสดง foobarbletch
        echo ${BASH_REMATCH[1]} -- แสดง bar
        echo ${BASH_REMATCH[2]} -- แสดง etch
fi

รูปแบบคำสั่งนี้ ทำงานมีประสิทธิภาพกว่าการรันโปรแกรม grep ต่างหาก ถ้าใน regular expression หรือสตริงมีตัวอักษรว่าง หรือตัวอักษรพิเศษ (เช่น '*' หรือ '?') ต้องใส่ในเครื่องหมายคำพูด

[แก้] การแปลงแบ็คสแลช

ข้อความในรูป $'string' จะถูกจัดการเป็นพิเศษ ข้อความดังกล่าวจะถูกแปลงเป็นstring โดยที่ตัวอักษรที่ขึ้นต้นด้วยแบคสแลช (\) จะถูกแปลงตามที่กำหนดไว้ในภาษาซี ดังตารางต่อไปนี้

การแปลงข้อความ
ข้อความเดิม แปลงเป็น
\a ตัวอักษร alert หรือ bell
\b ตัวอักษร backspace
\e ตัวอักษร escape
\f ตัวอักษร form feed
\n ตัวอักษร new line
\r ตัวอักษร carriage return
\t ตัวอักษร horizontal tab
\v ตัวอักษร vertical tab
\\ ตัวอักษร \
\' ตัวอักษร '
\nnn ตัวอักษร 8 บิตที่มีเลขฐานแปดเป็น nnn (หนึ่งถึงสามหลัก)
\xHH ตัวอักษร 8 บิตที่มีเลขฐานสิบหกเป็น HH (หนึ่งหรือสองหลัก)
\cx ตัวอักษร control-X

หลังจากแปลงแล้วข้อความจะอยู่ภายในเครื่องหมายคำพูด '...' เหมือนกับว่าไม่มีตัวอักษร $ อยู่

ข้อความตัวอักษรที่อยู่ภายใน $"..." จะถูกแปลตามโลเคล (locale) ปัจจุบัน ถ้าโลเคลปัจจุบันคือ C หรือ POSIX เครื่องหมายดอลลาร์จะไม่มีผล แต่ถ้าสตริงถูกแปลและแทนที่ ผลลัพธ์จะอยู่ในเครื่องหมายคำพูด "..."

[แก้] สคริปเริ่มทำงาน

เมื่อ bash เริ่มทำงาน มันจะทำคำสั่งในสคริปเริ่มต้นต่าง ๆ กันแล้วแต่กรณี

ถ้าเรียก bash เป็นเชลล์ล็อกอิน หรือเรียกโดยมีออพชัน --login มันจะไปค้นหา /etc/profile ตามด้วย ~/.bash_profile, ~/bash_login และ ~/.profile ตามลำดับ มันจะรันคำสั่งในไฟล์แรกที่มันพบและสามารถอ่านได้ สามารถสั่งให้ bash ไม่รันคำสั่งโดยออพชัน --noprofile

ถ้าล็อกอินเชลล์จบการทำงาน bash จะไปรันคำสั่งใน ~/.bash_logout ถ้ามี

ถ้าเรียก bash เป็นเชลล์โต้ตอบที่ไม่ใช้ล็อกอิน มันจะไปอ่านและรันคำสั่งใน ~/.bashrc ถ้ามี สามารถสั่งไม่ให้รันได้ด้วยออพชัน --norc และสั่งให้รันจากไฟล์ที่กำหนดด้วยออพชัน --rcfile

ถ้าเรียก bash เป็นเชลล์เพื่อรันสคริป มันจะตรวจสอบตัวแปร BASH_ENV และรันคำสั่งในไฟล์ที่ระบุ bash ไม่ใช้ตัวแปร PATH ในการค้นหาไฟล์

ถ้าเรียก bash โดยใช้ชื่อ sh มันจะเลียนแบบการทำงานของบอร์นเชลล์มากที่สุดเท่าที่ทำได้ ตราบเท่าที่ยังเป็นตามมาตรฐาน POSIX เมื่อเป็นล็อกอินเชลล์หรือมีออพชัน --login มันจะไปหา /etc/profile และ ~/.profile ตามลำดับ และสามารถใช้ --noprofile เพื่องดการรันคำสั่งเริ่มต้น เมื่อไม่เป็นล็อกอินเชลล์ มันจะหาไฟล์ที่กำหนดโดยตัวแปร ENV และเมื่อเรียกเพื่อรันสคริปจะไม่รันคำสั่งเริ่มต้นเลย

ถ้า bash ทำงานในโหมด POSIX โดยใช้ออพชัน --posix จะรันคำสั่งจากไฟล์ที่ระบุใน ENV เท่านั้นเพื่อเป็นไปตามมาตรฐาน POSIX

bash ยังตรวจว่ามันถูกเรียกจาก remote shell daemon ซึ่งมักเป็น rshd หรือไม่ ถ้าใช่ ก็จะรันคำสั่งใน ~/.bashrc (ยกเลิกได้โดยออพชัน --norc และเปลี่ยนไฟล์โดยใช้ออพชัน --rcfile แต่ปกติ rshd มักไม่สามารถรันเชลล์โดยระบุออพชันเหล่านี้)

[แก้] อ้างอิง

  1. ^ Ramey, Chet. Bash - the GNU shell (Reflections and Lessons Learned). เรียกข้อมูลวันที่ 2008-01-15

[แก้] แหล่งข้อมูลอื่น


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -