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.