บทนำ
หนึ่งในความหวังเดิมของ Unix คือมันจะทำให้ผู้ใช้คอมพิวเตอร์ทั่วไปสามารถปรับแต่งคอมพิวเตอร์ให้ตรงกับสไตล์การทำงานที่เป็นเอกลักษณ์ของพวกเขาได้ ความคาดหวังรอบการปรับแต่งคอมพิวเตอร์ลดลงไปตลอดทศวรรษ และผู้ใช้จำนวนมากมองว่าชุดแอปและเว็บไซต์ของพวกเขาคือ "สภาพแวดล้อมที่ปรับแต่งเอง" เหตุผลหนึ่งคือส่วนประกอบของระบบปฏิบัติการหลายตัวไม่ได้เปิดเผยซอร์สโค้ดให้ผู้ใช้ทั่วไปเข้าถึง
แตสำหรับผู้ใช้ Linux โปรแกรมที่ปรับแต่งเองเข้าถึงได้ เพราะระบบทั้งหมดพัฒนารอบคำสั่งที่ใช้งานได้ผ่านเทอร์มินัล เทอร์มินัลไม่ใช่แค่อินเทอร์เฟซสำหรับคำสั่งด่วนหรือการแก้ไขปัญหาลึก แต่มันเป็นสภาพแวดล้อมการเขียนสคริปต์ที่ลดภาระงานของคุณได้โดยการดูแลงาน đơn調ให้
วิธีเรียนรู้การเขียนโปรแกรม
หากคุณไม่เคยเขียนโปรแกรมมาก่อน อาจช่วยได้หากคิดในแง่ของสองความท้าทายที่แตกต่างกัน: หนึ่งคือการเข้าใจว่าโค้ดเขียนอย่างไร และอีกอันคือการเข้าใจว่าเขียนโค้ดอะไร คุณสามารถเรียนรู้ ไวยากรณ์ (syntax) — แต่คุณไม่ไปได้ไกลหรไม่รู้ว่าคำศัพท์ใดมีอยู่ใน ภาษา (language) ในทางปฏิบัติ คุณเริ่มเรียนรู้ทั้งสองแนวคิดพร้อมกัน เพราะคุณไม่สามารถเรียนไวยากรณ์ได้โดยไม่มีคำให้จัดเรียง ดังนั้นในตอนแรก คุณเขียนงานง่ายๆ โดยใช้คำสั่งพื้นฐานและโครงสร้างการเขียนโปรแกรมพื้นฐาน เมื่อคุณรู้สึกสบายกับพื้นฐานแล้ว คุณสามารถสำรวจภาษาเพิ่มเติมเพื่อให้โปรแกรมของคุณทำสิ่งที่ซับซ้อนและสำคัญมากขึ้น
ใน Bash คำส่วนใหญ่ที่คุณใช้คือคำสั่ง Linux ไวยากรณ์คือ Bash หากคุณใช้ Bash บ่อยๆ การเปลี่ยนมาสู่การเขียนโปรแกรม Bash จะง่ายดาย แต่หากคุณไม่ใช้ Bash คุณจะยินดีที่ได้รู้ว่ามันเป็นภาษาที่เรียบง่าย สร้างขึ้นเพื่อความชัดเจนและความเรียบง่าย
การออกแบบแบบโต้ตอบ
บางครั้ง สิ่งที่ยากที่สุดในการเรียนรู้เขียนโปรแกรมคือการหาว่าคอมพิวเตอร์ทำอะไรให้คุณได้ บางที ถ้าคอมพิวเตอร์เองทำทุกอย่างที่คุณทำได้ คุณก็ไม่ต้องสัมผัสคอมพิวเตอร์อีกเลย แต่ความเป็นจริงคือมนุษย์สำคัญ กุญแจสำคัญในการหางานที่คอมพิวเตอร์ช่วยได้คือการสังเกตงานที่คุณทำซ้ำๆ ตลอดสัปดาห์ คอมพิวเตอร์จัดการการซ้ำได้ดีมาก
แต่เพื่อให้คุณสั่งคอมพิวเตอร์ทำอะไรได้ คุณต้องรู้วิธีทำมัน นี่คือจุดที่ Bash โดดเด่น: การเขียนโปรแกรมแบบโต้ตอบ ขณะคุณดำเนินการในเทอร์มินัล คุณก็กำลังเรียนรู้วิธีเขียนสคริปต์มันด้วย
ตัวอย่างเช่น ผมเคยได้รับมอบหมายให้แปลงหนังสือ PDF จำนวนมากเป็นเวอร์ชันที่ใช้หมึกน้อยและเหมาะกับการพิมพ์ วิธีหนึ่งคือเปิด PDF ใน PDF editor เลือกรูปภาพแต่ละภาพของหลายร้อยหน้า — พื้นหลังและเท็กซ์ชาร์ของหน้าก็ถูกนับเป็นรูปภาพ — ลบพวกมัน แล้วบันทึกเป็น PDF ใหม่ หนังสือเล่มเดียวใช้เวลาครึ่งวันด้วยวิธีนี้
ความคิดแรกของผมคือเรียนรู้วิธีเขียนสคริปต์ PDF editor แต่หลังค้นหาหลายวัน ไม่พบแอปพลิเคชันแก้ไข PDF ที่เขียนสคริปต์ได้ (นอกจาก핵 mouse-automation ที่ดูไม่น่าสนใจ) ผมจึงหันไปหาวิธีทำงานจากภายในเทอร์มินัล ซึ่งนำไปสู่การค้นพบหลายอย่าง รวมถึง GhostScript เวอร์ชันโอเพนซอร์สของ PostScript (ภาษาพิมพ์ที่ PDF พัฒนามาจาก) ด้วยการใช้ GhostScript สำหรับงานนี้หลายวัน ผมยืนยันว่าเป็นโซลูชันของปัญหา
การสร้างสคริปต์พื้นฐานเพื่อรันคำสั่ง เพียงแค่นำคำสั่งและตัวเลือกที่ใช้ลบรูปภาพจาก PDF ไปวางในไฟล์ข้อความ การรันไฟล์เป็นสคริปต์ จะให้ผลลัพธ์เหมือนกันโดยคาดการณ์ได้
การส่งอาร์กิวเมนต์ให้สคริปต์ Bash
ความแตกต่างระหว่างการรันคำสั่งในเทอร์มินัลและใน shell script คืออันแรกเป็นแบบโต้ตอบ ในเทอร์มินัล คุณปรับแต่งขณะทำงาน ตัวอย่างเช่น ถ้าผมเพิ่งประมวลผล example_1.pdf และพร้อมสำหรับเอกสารถัดไป เพื่อปรับคำสั่ง ผมเพียงเปลี่ยนชื่อไฟล์
Shell script ไม่ใช่แบบโต้ตอบ จริงๆ แล้วเหตุผลเดียวที่ shell script มีอยู่คือเพื่อให้คุณไม่ต้องดูแลมัน นี่คือเหตุผลที่คำสั่ง (และ shell scripts ที่รันพวกมัน) ยอมรับอาร์กิวเมนต์
ใน shell script มีตัวแปรที่กำหนดไว้ล่วงหน้าบางตัวที่สะท้อนว่าสคริปต์เริ่มต้นอย่างไร ตัวแปรแรกคือ $0 แทนคำสั่งที่ใช้เริ่มสคริปต์ ตัวถัดไปคือ $1 แทน "อาร์กิวเมนต์" แรกที่ส่งให้ shell script ตัวอย่าง ในคำสั่ง echo hello คำสั่ง echo คือ $0 และคำว่า hello คือ $1 ในคำสั่ง echo hello world คำสั่ง echo คือ $0 hello คือ $1 และ world คือ $2
ใน interactive shell:
$ echo hello world hello world
ใน non-interactive shell script คุณ สามารถ ทำอย่างเดียวกันได้อย่างพื้นฐาน พิมพ์ข้อความนี้ในไฟล์ข้อความและบันทึกเป็น hello.sh:
echo hello world
ตอนนี้รันสคริปต์:
$ bash hello.sh hello world
มันทำงาน แต่ไม่ได้ใช้ประโยชน์จากข้อเท็จจริงว่าสคริปต์สามารถรับอินพุตได้ เปลี่ยน hello.sh เป็นนี้:
echo $1
รันสคริปต์ด้วยอาร์กิวเมนต์สองตัวจัดกลุ่มเป็นหนึ่งด้วยเครื่องหมายคำพูด:
$ bash hello.sh "hello bash" hello bash
สำหรับโปรเจค PDF reduction ของผม ผมมีความต้องการจริงสำหรับ non-interactivity แบบนี้ เพราะแต่ละ PDF ใช้เวลาหลายนาทีในการบีบอัด แต่โดยการสร้างสคริปต์ที่รับอินพุตจากผม ผมสามารถส่งหลายไฟล์ PDF ให้สคริปต์พร้อมกันได้ สคริปต์ประมวลผลแต่ละไฟล์ตามลำดับ ซึ่งอาจใช้เวลาครึ่งชั่วโมงหรือมากกว่า แต่มันเป็นครึ่งชั่วโมงที่ผมใช้ทำงานอื่นได้
การควบคุมโฟลว์
เขียน Bash scripts ที่เป็น transcript ของกระบวนการที่แน่นอนที่คุณใช้ทำงานที่ต้องการซ้ำ ได้อย่างสมบูรณ์ อย่างไรก็ตาม สคริปต์สามารถทำให้ทรงพลังมากขึ้นโดยการควบคุมข้อมูลไหลผ่าน วิธีทั่วไปในการจัดการการตอบสนองของสคริปต์ต่อข้อมูลคือ:
- if/then
- for loops
- while loops
- case statements
คอมพิวเตอร์ไม่ฉลาด แต่พวกมันเก่งการเปรียบเทียบและแยกวิเคราะห์ข้อมูล สคริปต์จะรู้สึกฉลาดมากขึ้นหากคุณสร้างการวิเคราะห์ข้อมูลเข้าไป ตัวอย่างเช่น hello.sh พื้นฐานรันได้ไม่ว่าจะมีอะไรให้ echo หรือไม่:
$ bash hello.sh foo foo $ bash hello.sh $
จะเป็นมิตรกับผู้ใช้มากขึ้นหากมันแสดงข้อความช่วยเหลือเมื่อไม่ได้รับอินพุต นั่นคือคำสั่ง if/then และหากคุณใช้ Bash แบบพื้นฐาน คุณอาจไม่รู้ว่ามีคำสั่งแบบนี้ใน Bash แต่มันเป็นส่วนหนึ่งของการเขียนโปรแกรม คือการเรียนรู้ภาษา ด้วยการค้นหาเล็กน้อย คุณจะรู้จัก if/then statements:
if [ "$1" = "" ]; then echo "syntax: $0 WORD" echo "If you provide more than one word, enclose them in quotes." else echo "$1" fi
การรันเวอร์ชันใหม่ของ hello.sh ให้ผลลัพธ์:
$ bash hello.sh syntax: hello.sh WORD If you provide more than one word, enclose them in quotes. $ bash hello.sh "hello world" hello world
การพัฒนาสคริปต์ทีละขั้นตอน
ไม่ว่าคุณจะมองหาอะไรที่ลบรูปภาพจาก PDF จัดการโฟลเดอร์ Downloads ที่وضุ้ย หรือสร้างและจัดเตรียม Kubernetes images การเรียนรู้การเขียนสคริปต์ Bash เป็นเรื่องของการใช้ Bash แล้วเรียนรู้วิธีนำสคริปต์เหล่านั้นจากแค่รายการคำสั่งไปสู่สิ่งที่ตอบสนองต่ออินพุต มักเป็นกระบวนการค้นพบ: คุณจะพบคำสั่ง Linux ใหม่ที่ทำงานที่คุณไม่เคยคิดว่าทำได้ด้วยคำสั่งข้อความ และคุณจะพบฟังก์ชันใหม่ของ Bash ที่ทำให้สคริปต์ของคุณปรับตัวได้กับทุกวิธีที่คุณต้องการให้รัน
วิธีหนึ่งในการเรียนรู้เทคนิคเหล่านี้คืออ่านสคริปต์ของคนอื่น ได้感受ว่าคนอื่นทำให้คำสั่งน่าเบื่อบนระบบของพวกเขาอัตโนมัติอย่างไร ดูว่าอะไรดูคุ้นเคย และหาข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ไม่คุ้นเคย
อีกวิธีคือดาวน์โหลด eBook เรื่องการเขียนโปรแกรมกับ Bash ของเรา มันแนะนำแนวคิดการเขียนโปรแกรมเฉพาะ Bash และด้วยโครงสร้างที่คุณเรียนรู้ คุณสามารถเริ่มสร้างคำสั่งของตัวเองได้ และ當然 มันฟรีและอนุญาตภายใต้ Creative Commons license ดาวน์โหลดได้เลยวันนี้