Bash - วิกิพีเดีย

# Bash

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

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

GNU Bourne-Again SHell
ภาพหน้าจอ
ผู้พัฒนา | เช็ต เรมี
รุ่นเสถียรล่าสุด | 3.1 (7 ธันวาคม พ.ศ. 2548)
รุ่นทดลองล่าสุด | {{{latest_beta_version}}} ({{{latest_beta_date}}})
OS | ลีนุกซ์, แมคโอเอสเท็น, ยูนิกซ์, ไมโครซอฟท์วินโดวส์ (ผ่านทาง Cygwin)
ชนิด | เชลล์ยูนิกซ์
ลิขสิทธิ์ | GPL
เว็บไซต์ | เว็บเพจของ GNU Bash

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

## [แก้] ลิงก์ภายนอก

- เว็บเพจโปรแกรม Bash
- เว็บเพจ Bash ของโครงการกนู

ดึงข้อมูลจาก "http://th.wikipedia.org../../../b/a/s/Bash.html".

หมวดหมู่: บทความที่มีชื่อเป็นภาษาอังกฤษ | โครงการกนู | ซอฟต์แวร์บนยูนิกซ์ | ภาษาโปรแกรม

##### Views

- บทความ
- อภิปราย
- รุ่นปัจจุบัน

##### ค้นหา

##### ภาษาอื่น

- العربية
- Български
- Bosanski
- Català
- Česky
- English
- Esperanto
- Español
- Suomi
- Français
- Galego
- עברית
- Hrvatski
- Italiano
- 日本語
- 한국어
- Nederlands
- Polski
- Português
- Русский
- Slovenčina
- Svenska
- Türkçe
- 中文