Một trong những hy vọng ban đầu của Unix là trao quyền cho người dùng máy tính thông thường tinh chỉnh máy tính để phù hợp với phong cách làm việc độc đáo. Kỳ vọng về tùy biến máy tính đã giảm dần qua nhiều thập kỷ, và nhiều người dùng coi bộ sưu tập ứng dụng và trang web là "môi trường tùy biến" của họ. Một lý do là các thành phần của nhiều hệ điều hành không mở, nên mã nguồn không khả dụng cho người dùng thường.
Nhưng đối với người dùng Linux, các chương trình tùy biến hoàn toàn tiếp cận được vì toàn bộ hệ thống dựa trên các lệnh có sẵn qua terminal. Terminal không chỉ giao diện cho lệnh nhanh hoặc troubleshooting sâu; nó là môi trường scripting có thể giảm tải công việc bằng cách lo những việc vặt.
Cách học lập trình
Nếu bạn chưa bao giờ lập trình, có thể hình dung như hai thách thức: hiểu cách viết code, và hiểu viết code gì. Bạn có thể học cú pháp – nhưng không đi xa nếu không biết từ vựng có sẵn trong ngôn ngữ. Thực tế, bạn học cả hai cùng lúc vì không thể học cú pháp mà không có từ để sắp xếp, nên ban đầu bạn viết tác vụ đơn giản dùng lệnh cơ bản và cấu trúc lập trình cơ bản. Khi thoải mái với cơ bản, bạn khám phá thêm ngôn ngữ để chương trình làm được nhiều việc quan trọng hơn.
Trong Bash, hầu hết từ bạn dùng là lệnh Linux. Cú pháp là Bash. Nếu bạn đã dùng Bash thường xuyên, chuyển sang lập trình Bash khá dễ. Nhưng nếu chưa, bạn sẽ vui biết nó là ngôn ngữ đơn giản, xây dựng cho sự rõ ràng và đơn giản.
Thiết kế tương tác
Đôi khi, điều khó nhất khi học lập trình là tìm ra máy tính có thể làm gì cho bạn. Rõ ràng, nếu máy tính tự làm mọi thứ bạn làm, bạn không cần chạm máy tính nữa. Nhưng thực tế con người quan trọng. Chìa khóa tìm việc máy tính giúp được là chú ý tác vụ bạn lặp lại trong tuần. Máy tính xử lý lặp lại đặc biệt tốt.
Nhưng để bạn bảo máy tính làm gì, bạn phải biết cách làm. Đây là điểm mạnh của Bash: lập trình tương tác. Khi bạn thực hiện hành động trong terminal, bạn cũng đang học cách viết script cho nó.
Ví dụ, tôi từng phải chuyển đổi nhiều sách PDF thành phiên bản tiết mực in ấn. Cách làm là mở PDF trong trình chỉnh sửa, chọn từng trăm hình ảnh – nền trang và kết cấu cũng tính là hình ảnh – xóa chúng, lưu thành PDF mới. Chỉ một cuốn sách mất nửa ngày.
Tôi nghĩ đến việc học script trình chỉnh sửa PDF, nhưng sau nhiều ngày tìm kiếm, không tìm thấy ứng dụng chỉnh sửa PDF có thể script (ngoài hack tự động chuột xấu xí). Vậy tôi chuyển sang tìm cách làm trong terminal. Kết quả là vài phát hiện mới, bao gồm GhostScript, phiên bản mã nguồn mở của PostScript (ngôn ngữ in ấn PDF dựa trên). Bằng cách dùng GhostScript vài ngày, tôi xác nhận nó giải quyết vấn đề.
Viết script cơ bản chạy lệnh chỉ là copy lệnh và tùy chọn dùng để xóa hình ảnh từ PDF, dán vào file text. Chạy file như script sẽ cho kết quả giống nhau.
Truyền tham số cho script Bash
Khác biệt giữa chạy lệnh trong terminal và trong shell script là cái trước tương tác. Trong terminal, bạn điều chỉnh khi chạy. Ví dụ, vừa xử lý example_1.pdf và sẵn sàng cho tài liệu tiếp theo, để thích ứng lệnh, tôi chỉ thay tên file.
Shell script không tương tác. Thực tế, lý do duy nhất shell script tồn tại là để bạn không phải chăm sóc nó. Đó là lý do lệnh (và script chạy chúng) chấp nhận tham số.
Trong shell script, có vài biến định sẵn phản ánh cách script bắt đầu. Biến đầu tiên là $0, đại diện cho lệnh khởi động script. Biến tiếp theo $1 đại diện cho "tham số" đầu tiên truyền cho script. Ví dụ, lệnh echo hello, lệnh echo là $0, từ hello là $1. Lệnh echo hello world, echo là $0, hello là $1, world là $2.
Trong shell tương tác:
$ echo hello world
hello world
Trong shell script không tương tác, bạn có thể làm tương tự theo cách nghĩa đen. Gõ text này vào file text lưu thành hello.sh:
echo hello world
Chạy script:
$ bash hello.sh
hello world
Đó hoạt động, nhưng không tận dụng script có thể nhận input. Thay đổi hello.sh thành:
echo $1
Chạy script với hai tham số gom thành một bằng ngoặc kép:
$ bash hello.sh "hello bash"
hello bash
Dự án giảm PDF của tôi có nhu cầu thực tế cho phi tương tác này, vì mỗi PDF mất vài phút nén. Nhờ script nhận input, tôi có thể cho script xử lý vài PDF cùng lúc. Script xử lý tuần tự, có thể mất nửa giờ trở lên, nhưng là nửa giờ tôi dùng cho việc khác.
Điều khiển luồng
Hoàn toàn chấp nhận tạo script Bash bản chất là bản ghi quy trình chính xác bạn làm để hoàn thành tác vụ cần lặp lại. Tuy nhiên, script có thể mạnh hơn bằng cách điều khiển thông tin luân chuyển qua nó. Phương pháp phổ biến quản lý phản hồi script với dữ liệu:
- if/then
- vòng lặp for
- vòng lặp while
- câu lệnh case
Máy tính không thông minh, nhưng giỏi so sánh và phân tích dữ liệu. Script cảm thấy thông minh hơn nếu bạn xây dựng phân tích dữ liệu vào. Ví dụ, script hello.sh cơ bản chạy dù có input hay không:
$ bash hello.sh foo
foo
$ bash hello.sh
$
Sẽ thân thiện hơn nếu hiển thị trợ giúp khi không có input. Đó là câu lệnh if/then, và nếu bạn dùng Bash cơ bản, có thể không biết câu lệnh đó tồn tại trong Bash. Nhưng một phần lập trình là học ngôn ngữ, với chút tìm hiểu bạn sẽ biết if/then:
if [ "$1" = "" ]; then
echo "cú pháp: $0 TỪ"
echo "Nếu cung cấp nhiều từ, hãy đặt trong ngoặc kép."
else
echo "$1"
fi
Chạy phiên bản mới hello.sh cho kết quả:
$ bash hello.sh
cú pháp: hello.sh TỪ
Nếu cung cấp nhiều từ, hãy đặt trong ngoặc kép.
$ bash hello.sh "hello world"
hello world
Làm việc qua script
Dù bạn tìm cách xóa hình ảnh từ PDF, quản lý thư mục Downloads lộn xộn, hay tạo và cung cấp hình ảnh Kubernetes, học scripting Bash là việc dùng Bash rồi học cách đưa script từ danh sách lệnh thành thứ phản hồi input. Thường là quá trình khám phá: bạn chắc chắn tìm lệnh Linux mới làm tác vụ bạn không tưởng chỉ bằng lệnh text, và tìm hàm Bash mới làm script thích ứng mọi cách bạn muốn chạy.
Cách học thủ thuật là đọc script người khác. Cảm nhận cách mọi người tự động hóa lệnh lặp lại trên hệ thống. Xem gì quen thuộc, tìm thêm thông tin về gì lạ.
Cách khác là tải eBook giới thiệu lập trình với Bash của chúng tôi. Nó giới thiệu khái niệm lập trình riêng cho Bash, và với cấu trúc bạn học, bạn có thể bắt đầu xây dựng lệnh riêng. Và đương nhiên, miễn phí tải về và cấp phép Creative Commons, hãy lấy bản sao hôm nay.