Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

เริ่มต้นใช้งานสคริปต์ Bash สำหรับ sysadmins

เปลือก Bash ไม่ใช่เปลือกเดียวที่มีอยู่ แต่เป็นหนึ่งในเปลือกที่ทรงพลังที่สุด ซึ่งทำให้เป็นตัวเลือกยอดนิยมสำหรับผู้ดูแลระบบที่ต้องการพัฒนาแอปพลิเคชันที่จริงจัง ซึ่งทำได้มากกว่า "รายการซักผ้า" ของคำสั่งง่ายๆ เพื่อเรียกใช้บนระบบ มีการใช้งานที่ยอดเยี่ยมมากมายสำหรับเชลล์อื่นๆ (เช่น ค่าเริ่มต้นคือ Tcsh สำหรับ Git hooks) แต่ Bash เป็นตัวเลือกที่ง่ายสำหรับการเขียนสคริปต์อย่างจริงจัง และนี่คือเหตุผล

ฟังก์ชัน

ในการสร้างฟังก์ชันในสคริปต์ทุบตี ให้ใช้คำหลัก ฟังก์ชัน :

ฟังก์ชัน foo {
# รหัสที่นี่
}

ฟังก์ชันมีประโยชน์สำหรับโปรแกรมเมอร์ เนื่องจากช่วยลดความซ้ำซ้อนในโค้ด ความซ้ำซ้อนในโค้ดที่น้อยลงช่วยลดปริมาณการบำรุงรักษาที่จำเป็น เนื่องจากหากคุณต้องการเปลี่ยนค่า คุณจะต้องค้นหาเพียงครั้งเดียว (ในฟังก์ชัน) แทนที่จะค้นหาทุกครั้งที่ใช้งาน

Bash ซ้อนกันอย่างไร

ฟังก์ชันต่างๆ ได้รับการสนับสนุนอย่างดีในเชลล์ ยกเว้น Tcsh ที่โดดเด่น

  • คอร์นเชลล์: ใช้ไวยากรณ์เดียวกับ Bash
  • Zsh: ใช้ไวยากรณ์เดียวกับ Bash
  • ปลา: ใช้ฟังก์ชันที่กำหนดเอง คำสั่งสร้างและจัดการฟังก์ชัน
  • TCSH: บางครั้ง คุณสามารถแก้ไขการขาดฟังก์ชันใน Tcsh ได้โดยใช้ goto คำสั่ง แต่ไม่ค่อยเป็นตัวเลือกที่เหมาะสมที่สุด

การเปลี่ยนเส้นทาง

การเปลี่ยนเส้นทางของอินพุตและเอาต์พุตเป็นฟังก์ชันมาตรฐานที่ค่อนข้างดีในภาษาการเขียนโปรแกรมและสคริปต์ใดๆ และจะเกิดขึ้นโดยธรรมชาติเมื่อคุณใช้เชลล์ คุณป้อนข้อความ คุณได้รับผลลัพธ์ เชลล์บางตัวแข็งแกร่งกว่าตัวอื่น และอย่างที่คุณอาจเดาได้ Bash ให้ตัวเลือกเกือบทุกอย่างที่คุณจะจินตนาการได้

พื้นฐานนั้นง่าย:ใช้ > . จำนวนหนึ่ง อักขระเพื่อเปลี่ยนเส้นทางเอาต์พุตและจำนวน < อักขระเพื่อเปลี่ยนเส้นทางอินพุต มีการกำหนดพิเศษสำหรับอินพุตและเอาต์พุตบางประเภท ตัวอย่างเช่น ข้อความแสดงข้อผิดพลาดไปที่สตรีมชื่อ stderr ซึ่งถูกกำหนดให้เป็น 2> เพื่อวัตถุประสงค์ในการเปลี่ยนเส้นทาง ตัวอย่างเช่น คำสั่งนี้นำข้อความแสดงข้อผิดพลาดไปยังไฟล์ชื่อ output.log :

$ ls /void 2> output.log 

Bash ทำงานอย่างไร

การเปลี่ยนเส้นทางเป็นฟังก์ชันที่สะดวกอย่างยิ่งเมื่อโต้ตอบกับเชลล์ และในขณะที่เชลล์หลักทั้งหมดสนับสนุนการเปลี่ยนเส้นทางบางลักษณะ คุณลักษณะบางอย่างอาจไม่พร้อมใช้งานในทุกเชลล์

  • คอร์นเชลล์: ใช้ไวยากรณ์เดียวกับ Bash
  • Zsh: ใช้ไวยากรณ์เดียวกับ Bash
  • ปลา: การสนับสนุนบางส่วน
  • TCSH: การสนับสนุนบางส่วน

ที่มา

เมื่อคุณซอร์สไฟล์ในเชลล์ คุณกำลังนำเข้าไฟล์ไปยังสภาพแวดล้อมเชลล์ของคุณ กระสุนส่วนใหญ่จัดการกับสิ่งนี้ได้อย่างดี แต่บางอันมีคุณสมบัติพิเศษบางอย่างเพื่อความสะดวกของคุณ

ตัวอย่างเช่น เมื่อคุณใช้ แหล่งที่มา ใน Bash จะค้นหาไดเรกทอรีปัจจุบันของคุณสำหรับไฟล์ที่คุณอ้างอิง หากไม่พบไฟล์ที่ต้นทาง ระบบจะค้นหา PATH ของคุณแทน เป็นโบนัสเล็กน้อย แต่สะดวกมากเพราะช่วยให้คุณสามารถจัดเก็บฟังก์ชันทั่วไปในตำแหน่งที่รวมศูนย์บนไดรฟ์ของคุณ แล้วปฏิบัติต่อสภาพแวดล้อมของคุณเหมือนกับสภาพแวดล้อมการพัฒนาแบบบูรณาการ (IDE) คุณไม่ต้องกังวลว่าฟังก์ชันของคุณจะถูกเก็บไว้ที่ใด เพราะคุณรู้ว่าฟังก์ชันเหล่านี้เทียบเท่ากับ /usr/include ในพื้นที่ของคุณ ดังนั้นไม่ว่าคุณจะอยู่ที่ไหนเมื่อคุณหาแหล่งที่มา Bash ก็พบมัน

Bash ทำงานอย่างไร

Bash เป็นเชลล์เดียวที่ค้นหาทั้งไดเรกทอรีปัจจุบันและ PATH . ของคุณ เมื่อคุณใช้ แหล่งที่มา คำสั่งหรือตัวย่อ (และถูกต้อง POSIX) สัญกรณ์

การโยงคีย์

เชลล์จำนวนมากช่วยให้คุณปรับแต่งวิธีการโต้ตอบกับเชลล์ได้ และแน่นอนว่าการโต้ตอบใดๆ กับอินเทอร์เฟซแบบข้อความจะเริ่มต้นด้วยการพิมพ์ ใน Bash คุณสามารถดูคีย์แมปปัจจุบันของคุณ:

$ bind -V | grep keymap 

วิธีเปลี่ยนคีย์แมปของคุณ (เช่น จาก Emacs เป็น Vi):

$ bind 'set keymap vi' 

Bash ซ้อนกันอย่างไร

เฉพาะ Bash และ Zsh เท่านั้นที่มีการตั้งค่าล่วงหน้าในตัวสำหรับการผูกคีย์

ประวัติ

Bash มีอินเทอร์เฟซประวัติคำสั่งที่แข็งแกร่งที่สุดของเชลล์ใดๆ ประวัติเวอร์ชัน Bash ช่วยให้สามารถค้นหาย้อนกลับ เรียกคืนอย่างรวดเร็ว แก้ไขประวัติ (รวมถึงการลบรายการตามหมายเลขบรรทัด) และอื่นๆ เชลล์อื่น ๆ ทั้งหมดรวมกันตรงกับอินเทอร์เฟซประวัติของ Bash แต่ไม่มี (แม้แต่ Zsh ซึ่งโดยทั่วไปจะเลียนแบบ Bash) จับคู่กับมันเอง

การบิดเบือนประวัติ

ประวัติศาสตร์ คำสั่งไม่ใช่วิธีเดียวที่จะโต้ตอบกับอดีตของคุณ Bash มีคอลเล็กชันการจดชวเลขมากมายที่ช่วยให้คุณสามารถเรียกคืนและแก้ไขคำสั่งในประวัติเชลล์ของคุณได้

ตัวอย่างเช่น เพื่อเรียกใช้คำสั่งล่าสุดอีกครั้ง (ผลลัพธ์ของ  history | tail -n1 โดยใช้ ช่องว่าง . นำหน้า กำหนดโดย   ,  เพื่อกันไม่ให้คำสั่ง history ถูกลบออกจาก history ให้พิมพ์ !! เป็น Bash.:

$ wc -w luarocks.xml
1284 luarocks.xml
$ !!
1284 luarocks.xml

ในการรันคำสั่งล่าสุดในขณะที่แทนที่บางส่วนของคำสั่งนั้นเป็นอย่างอื่น คุณสามารถใช้การแทนที่สตริง:

$ wc -w luarocks.xml
1284 luarocks.xml
$ ^-w^-l
$ wc -l luarocks.xml
214 luarocks.xml

มีทางลัดดังกล่าวมากมาย ซึ่งทั้งหมดได้รับการบันทึกไว้ใน Bash man และหน้าข้อมูล เป็นที่ยอมรับว่ากลอุบายเหล่านี้มีไว้สำหรับผู้ใช้ขั้นสูงที่การโต้ตอบของ Bash ซ้ำซากและเป็นเรื่องธรรมดาที่การผสมคีย์แบบสุ่มที่ดูเหมือนคลุมเครือนั้นมีประโยชน์ Zsh เลียนแบบ Bash ได้อย่างมีประสิทธิภาพ แต่ไม่มีเชลล์อื่นใดที่จะมีประสิทธิภาพสูงสุดเช่นนี้

Bash ทำงานอย่างไร

คำสั่ง history ของ Bash ไม่ตรงกับเชลล์อื่นใด (Zsh เข้ามาใกล้ แต่ไม่มีตัวเลือกบางอย่าง เช่น ความสามารถในการลบตามหมายเลขบรรทัด)

Associative Arrays

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

อย่างไรก็ตาม Bash มีความสามารถในการสร้างอาร์เรย์ที่เชื่อมโยงและปฏิบัติกับอาร์เรย์เหล่านี้เหมือนกับอาร์เรย์อื่นๆ แอสโซซิเอทีฟอาเรย์ช่วยให้คุณสร้างรายการของคู่คีย์และค่า แทนที่จะสร้างแค่ค่าตัวเลข

ข้อดีของ associative arrays คือคีย์สามารถกำหนดเองได้:

$ ประกาศ -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`

สอบถามคีย์ใด ๆ :

$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192

การดำเนินการอาร์เรย์ตามปกติส่วนใหญ่ที่คุณคาดหวังจากอาร์เรย์จะพร้อมใช้งาน

Bash ทำงานอย่างไร

Bash เป็นเชลล์เพียงตัวเดียวที่ให้การสนับสนุนอาร์เรย์ที่เชื่อมโยงอย่างสมบูรณ์ (อีกครั้ง Zsh เข้ามาใกล้ แต่ไม่มีฟังก์ชันในการแสดงรายการคีย์)

เลือก Bash สำหรับเชลล์สคริปต์

สิ่งอำนวยความสะดวกบางอย่างใน Bash ไม่สอดคล้องกับ POSIX ในทางทฤษฎี หมายความว่าคุณสามารถเขียนสคริปต์ Bash ที่ไม่ทำงานตามที่คาดไว้บนระบบที่ไม่มี Bash หากเป็นเช่นนั้น สคริปต์ของคุณไม่ใช่ "พกพา"

ในทางปฏิบัติ Bash เป็นซอฟต์แวร์โอเพ่นซอร์สฟรี ดังนั้นใครๆ ก็สามารถติดตั้งได้ ไม่ว่าจะเป็น Linux, BSD, OpenIndiana, Windows หรือ macOS การติดตั้ง Bash ไม่ต้องการให้ผู้ใช้ใช้ Bash เป็นเชลล์เริ่มต้น หรือแม้กระทั่งเปิดใช้งานอย่างมีสติ เนื่องจากเชลล์สคริปต์ที่ดีจะระบุว่าเชลล์ใช้อะไรใน shebang ระดับบนสุด บรรทัด (#!/bin/bash เช่น)

หากมีข้อสงสัย ให้รวม Bash เป็นการขึ้นต่อกันของเชลล์สคริปต์ของคุณ (แม้ว่าจะเป็นเพียงการพึ่งพาอาศัยกันเท่านั้น) ในเอกสารประกอบของคุณเพื่อเตือนผู้ใช้ว่าเป็นสคริปต์ทุบตีและไม่ใช่เชลล์สคริปต์ทั่วไป

Bash มีสิ่งอำนวยความสะดวกมากมาย และฉันพบว่าสิ่งเหล่านั้นมีมากกว่าความกังวลว่าผู้ใช้ติดตั้ง Bash หรือไม่ เช่นเดียวกับ Python หรือ Java หรือซอฟต์แวร์อื่นๆ บางครั้งก็มีการขึ้นต่อกัน หากคุณชอบ Bash และพบว่าการจดชวเลขและทางลัดนั้นมีประโยชน์ อย่าย่อให้สั้นลง

ดาวน์โหลด eBook ของเราเกี่ยวกับการเขียนสคริปต์ทุบตีสำหรับผู้ดูแลระบบ!