Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Làm chủ Bash: Đọc & ghi file như chuyên gia

Khi scripting với Bash, đôi khi cần đọc dữ liệu từ hoặc ghi dữ liệu vào file. Đôi khi file chứa tùy chọn cấu hình, đôi khi file là dữ liệu user tạo với ứng dụng. Mọi ngôn ngữ xử lý khác nhau, bài này demo xử lý file dữ liệu với Bash và shell POSIX khác.

Cài đặt Bash

Nếu bạn trên Linux, chắc đã có Bash. Nếu không, tìm trong kho phần mềm.

Trên macOS, dùng terminal mặc định, Bash hoặc Zsh tùy phiên bản.

Trên Windows, có vài cách trải nghiệm Bash, bao gồm WSL (Windows Subsystem for Linux) chính thức của Microsoft.

Khi đã có Bash, mở trình soạn thảo yêu thích và sẵn sàng code.

Đọc file với Bash

Ngoài là shell, Bash là ngôn ngữ scripting. Có vài cách đọc dữ liệu từ Bash: tạo luồng dữ liệu phân tích output, hoặc nạp dữ liệu vào bộ nhớ. Cả hai hợp lệ ingest thông tin, nhưng mỗi có use case cụ thể.

Source file trong Bash

Khi bạn "source" file trong Bash, bạn khiến Bash đọc nội dung file với kỳ vọng chứa dữ liệu hợp lệ Bash vừa vặn mô hình dữ liệu thiết lập. Bạn không source dữ liệu từ file tùy tiện, nhưng dùng phương pháp này đọc file cấu hình và hàm.

Ví dụ, tạo file example.sh nhập:

#!/bin/sh

greet opensource.com

echo "The meaning of life is $var"

Chạy code thấy fail:

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

Bash không có lệnh greet, nên không thực thi dòng đó, và không có biến var, nên không có ý nghĩa cuộc sống. Để sửa, tạo file include.sh:

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

var=42

Sửa script example.sh thêm lệnh source:

#!/bin/sh

source include.sh

greet opensource.com

echo "The meaning of life is $var"

Chạy script thấy hoạt động:

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

Lệnh greet nhập vào môi trường shell vì định nghĩa trong include.sh, và nhận diện tham số (opensource.com). Biến var cũng được set và nhập.

Phân tích file trong Bash

Cách khác đưa dữ liệu "vào" Bash là phân tích như luồng dữ liệu. Nhiều cách làm. Dùng grep hoặc cat hoặc lệnh nào lấy data pipe ra stdout. Hoặc dùng built-in Bash: chuyển hướng (redirect). Chuyển hướng 자체 không hữu ích, nên ví dụ dùng built-in echo in kết quả redirect:

#!/bin/sh

echo $( < include.sh )

Lưu thành stream.sh chạy thấy kết quả:

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

Mỗi dòng trong include.sh, Bash in (echo) dòng đó ra terminal. Pipe trước qua parser phù hợp là cách phổ biến đọc dữ liệu với Bash. Ví dụ, giả sử include.sh là file cấu hình cặp khóa-giá trị phân tách bằng dấu bằng (=). Bạn lấy giá trị với awk hoặc cut:

#!/bin/sh

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

echo $myVar

Chạy script:

$ bash ./stream.sh
42

Ghi dữ liệu ra file với Bash

Dù lưu dữ liệu user tạo với ứng dụng hoặc chỉ metadata việc user làm trong app (ví dụ game save hoặc bài hát gần đây), nhiều lý do lưu dữ liệu dùng sau. Trong Bash, lưu dữ liệu vào file dùng chuyển hướng shell phổ biến.

Ví dụ, tạo file mới chứa output, dùng token chuyển hướng đơn:

#!/bin/sh

TZ=UTC
date > date.txt

Chạy script vài lần:

$ 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

Để thêm dữ liệu (append), dùng token chuyển hướng kép:

#!/bin/sh

TZ=UTC
date >> date.txt

Chạy script vài lần:

$ 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 cho lập trình dễ dàng

Bash xuất sắc ở dễ học vì, với chỉ vài khái niệm cơ bản, bạn xây dựng chương trình phức tạp. Cho tài liệu đầy đủ, tham khảo tài liệu Bash tuyệt vời trên GNU.org.