รูปแบบคำสั่ง ของ แบช

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

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

ต่อไปนี้เป็นตัวอย่างรูปแบบคำสั่งที่เพิ่มเติมมาในแบชซึ่งบอร์นเชลล์ไม่มี

การคำนวณเลขจำนวนเต็ม

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

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

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

if ((VAR == Y * 3 + X * 2))then        echo Yesfi((Z > 23)) && echo Yes

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

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

เปลี่ยนทิศทาง I/O

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

command &> file

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

ตั้งแต่รุ่น 2.05b เป็นต้นมา แบชสามารถดึงข้อความสตริงไปเข้า 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# ปิด FD6exec 6>&-

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

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

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

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

การตรวจสอบนพจน์ปรกติ

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

[[string =~ regex]]

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

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

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

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

ข้อความในรูป $'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 เครื่องหมายดอลลาร์จะไม่มีผล แต่ถ้าสตริงถูกแปลและแทนที่ ผลลัพธ์จะอยู่ในเครื่องหมายคำพูด "..."