Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Bash: การอ่านและเขียนไฟล์อย่างมืออาชีพ

บทนำ

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

ติดตั้ง Bash

หากคุณอยู่บน Linux คุณน่าจะมี Bash แล้ว หากไม่มี คุณหาได้ใน software repository

บน macOS คุณใช้ terminal เริ่มต้นได้ ไม่ว่าจะเป็น Bash หรือ Zश ขึ้นอยู่กับ macOS version

บน Windows มีหลายวิธีใช้ Bash รวมถึง Windows Subsystem for Linux (WSL) ที่ Microsoft รองรับอย่างเป็นทางการ

เมื่อคุณมี Bash แล้ว เปิด text editor โปรดและพร้อมเขียนโค้ด

การอ่านไฟล์ด้วย Bash

นอกจากเป็น shell แล้ว Bash ยังเป็น scripting language มีหลายวิธีอ่านข้อมูลจาก Bash: คุณสามารถสร้าง data stream และแยกวิเคราะห์เอาต์พุต หรือโหลดข้อมูลเข้า memory ทั้งสองเป็นวิธีที่ถูกต้องในการรับข้อมูล แต่แต่ละอย่างมี use cases เฉพาะ

Source ไฟล์ใน Bash

เมื่อคุณ "source" ไฟล์ใน Bash คุณสั่งให้ Bash อ่านเนื้อหาไฟล์ด้วยความคาดหวังว่ามันมีข้อมูลที่ถูกต้องซึ่ง Bash สามารถใส่เข้า data model ที่สร้างไว้แล้ว คุณจะไม่ source ข้อมูลจากไฟล์เก่าๆ แต่คุณสามารถใช้วิธีนี้อ่านไฟล์ config และ functions

ตัวอย่าง สร้างไฟล์ชื่อ example.sh และใส่นี้เข้าไป:

#!/bin/sh

greet opensource.com

echo "The meaning of life is $var"

รันโค้ดเพื่อดูมันล้มเหลว:

$ bash ./example.sh
./example.sh: line 3: greet: command not found
The meaning of life is 

Bash ไม่มีคำสั่งชื่อ greet ดังนั้นไม่สามารถรันบรรทัดนั้นได้ และไม่มีบันทึกตัวแปรชื่อ var ดังนั้นไม่มีความหมายของชีวิตที่รู้จัก เพื่อแก้ปัญหานี้ สร้างไฟล์ชื่อ include.sh:

greet() {
echo "Hello ${1}"
}

var=42

ปรับ example.sh ให้มีคำสั่ง source:

#!/bin/sh

source include.sh

greet opensource.com

echo "The meaning of life is $var"

รันสคริปต์เพื่อดูมันทำงาน:

$ bash ./example.sh
Hello opensource.com
The meaning of life is 42

คำสั่ง greet ถูกนำเข้าสู่สภาพแวดล้อม shell ของคุณ เพราะมันถูกกำหนดในไฟล์ include.sh และมันแม้รู้จัก argument (opensource.com ในตัวอย่าง) ตัวแปร var ถูกตั้งค่าและนำเข้าด้วย

แยกวิเคราะห์ไฟล์ใน Bash

อีกวิธีหนึ่งในการได้ข้อมูล "เข้า" Bash คือการ parse มันเป็น data stream มีหลายวิธี คุณสามารถใช้ grep หรือ cat หรือคำสั่งใดๆ ที่รับข้อมูลและ pipe ไป stdout หรือใช้สิ่งที่ built-in ใน Bash: redirect Redirection ตัวเองไม่ค่อยมีประโยชน์ ดังนั้นในตัวอย่างนี้ ผมใช้ built-in echo พิมพ์ผลลัพธ์ของ redirect:

#!/bin/sh

echo $( < include.sh )

บันทึกเป็น stream.sh และรันเพื่อดูผลลัพธ์:

$ bash ./stream.sh
greet() { echo "Hello ${1}" } var=42
$

สำหรับแต่ละบรรทัดในไฟล์ include.sh Bash พิมพ์ (หรือ echo) บรรทัดนั้นไปที่เทอร์มินัลของคุณ การ pipe ไป parser ที่เหมาะสมก่อนเป็นวิธีทั่วไปในการอ่านข้อมูลด้วย Bash ตัวอย่าง สมมติว่า include.sh เป็น config file ที่มี key-value pairs คั่นด้วยเครื่องหมายเท่ากับ (=) คุณสามารถดึงค่าได้ด้วย awk หรือแม้แต่ cut:

#!/bin/sh

myVar=`grep var include.sh | cut -d'=' -f2`

echo $myVar

ลองรันสคริปต์:

$ bash ./stream.sh
42

การเขียนข้อมูลลงไฟล์ด้วย Bash

ไม่ว่าคุณจะเก็บข้อมูลที่ผู้ใช้สร้างด้วยแอปพลิเคชันของคุณ หรือแค่ metadata เกี่ยวกับสิ่งที่ผู้ใช้ทำในแอป (เช่น game saves หรือเพลงที่เล่นล่าสุด) มีหลายเหตุผลที่ดีที่จะเก็บข้อมูลไว้ใช้ภายหลัง ใน Bash คุณสามารถบันทึกข้อมูลไปไฟล์ได้โดยใช้ shell redirection ทั่วไป

ตัวอย่าง เพื่อสร้างไฟล์ใหม่ที่มีเอาต์พุต ใช้ redirect token เดียว:

#!/bin/sh

TZ=UTC
date > date.txt

รันสคริปต์หลายครั้ง:

$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:06 UTC 2021
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021

เพื่อ append ข้อมูล ใช้ double redirect tokens:

#!/bin/sh

TZ=UTC
date >> date.txt

รันสคริปต์หลายครั้ง:

$ bash ./date.sh
$ bash ./date.sh
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
Tue Feb 23 22:25:17 UTC 2021
Tue Feb 23 22:25:19 UTC 2021
Tue Feb 23 22:25:22 UTC 2021

Bash สำหรับการเขียนโปรแกรมที่ง่าย

Bash โดดเด่นที่ง่ายต่อการเรียนรู้ เพราะด้วยแค่หลักการพื้นฐานไม่กี่ข้อ คุณสามารถสร้างโปรแกรมที่ซับซ้อนได้ สำหรับเอกสารเต็ม โปรดอ้างอิงเอกสาร Bash ที่ยอดเยี่ยมบน GNU.org