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

Làm chủ scripting Bash cho quản trị hệ thống: Hướng dẫn người mới

Shell Bash chắc chắn không phải shell duy nhất, nhưng là một trong những shell mạnh nhất. Điều này làm nó trở thành lựa chọn phổ biến cho quản trị hệ thống cần phát triển ứng dụng nghiêm túc vượt ra khỏi "danh sách việc" đơn giản các lệnh chạy trên hệ thống. Có nhiều việc tuyệt vời cho shell khác (mặc định tôi dùng Tcsh cho Git hook), nhưng Bash là lựa chọn dễ dàng cho scripting nghiêm túc, và đây là lý do.

Hàm (Functions)

Để tạo hàm trong script Bash, dùng từ khóa function:

function foo {
# code here
}

Hàm hữu ích cho lập trình viên vì giúp giảm thiểu code lặp. Ít code lặp giảm bảo trì vì nếu cần thay giá trị, chỉ tìm một lần (trong hàm) thay vì mọi nơi nó được dùng.

Bash so với các shell khác

Hàm được hỗ trợ khá tốt trong các shell, ngoại trừ Tcsh đáng chú ý.

  • Korn shell: Cú pháp giống Bash
  • Zsh: Cú pháp giống Bash
  • Fish: Dùng lệnh function tùy chỉnh để tạo và thao tác hàm
  • Tcsh: Đôi khi có thể vượt qua thiếu hàm bằng câu lệnh goto, nhưng hiếm khi tối ưu.

Chuyển hướng (Redirection)

Chuyển hướng input/output là chức năng tiêu chuẩn trong mọi ngôn ngữ lập trình/scripting, và xảy ra tự nhiên khi dùng shell. Bạn nhập text; nhận output. Một số shell mạnh hơn, và như bạn đoán, Bash cho gần như mọi tùy chọn.

Cơ bản đơn giản: dùng số lượng > để chuyển hướng output, số lượng < để chuyển hướng input. Có chỉ định đặc biệt cho loại input/output cụ thể. Ví dụ, thông báo lỗi đi đến luồng stderr, chỉ định là 2> cho chuyển hướng. Lệnh này chuyển thông báo lỗi đến file output.log:

$ ls /void 2> output.log

Bash so với các shell khác

Chuyển hướng là tiện ích tuyệt vời khi tương tác shell, và dù các shell chính hỗ trợ某种形式 chuyển hướng, không phải tính năng nào cũng có ở mọi shell.

  • Korn shell: Cú pháp giống Bash
  • Zsh: Cú pháp giống Bash
  • Fish: Hỗ trợ một phần
  • Tcsh: Hỗ trợ một phần

Nạp (Source)

Khi bạn nạp (source) một file trong shell, bạn nhập file vào môi trường shell. Hầu hết shell xử lý tốt, nhưng một số cung cấp tính năng thêm cho tiện lợi.

Ví dụ, khi dùng source trong Bash, nó tìm file trong thư mục hiện tại. Nếu không tìm thấy, nó tìm trong PATH. Tiện ích nhỏ nhưng rất thuận tiện vì cho phép lưu hàm chung ở vị trí tập trung trên ổ cứng và đối xử môi trường như IDE tích hợp. Bạn không lo đâu hàm được lưu, vì biết chúng ở tương đương /usr/include cục bộ, nên 어디서 bạn source, Bash đều tìm thấy.

Bash so với các shell khác

Bash là shell duy nhất tìm cả thư mục hiện tại và PATH khi dùng source hoặc ký hiệu viết tắt (và đúng POSIX) ..

Ràng buộc phím (Key bindings)

Nhiều shell cho phép tùy chỉnh tương tác, và mọi tương tác giao diện text bắt đầu bằng gõ phím. Trong Bash, xem keymap hiện tại:

$ bind -V | grep keymap

Đổi keymap (từ Emacs sang Vi, ví dụ):

$ bind 'set keymap vi'

Bash so với các shell khác

Chỉ Bash và Zsh cung cấp preset built-in cho key bindings.

Lịch sử (History)

Bash có giao diện lịch sử lệnh mạnh mẽ nhất trong các shell. Phiên bản Bash của history cho phép tìm kiếm ngược, hồi tưởng nhanh, chỉnh sửa lịch sử (kể cả xóa entry theo số dòng), và hơn nữa. Tất cả shell khác cộng lại chỉ ngang ngửa history của Bash, nhưng không shell nào (kể cả Zsh, thường mô phỏng Bash) đạt được riêng lẻ.

Thao tác lịch sử

Lệnh history không phải cách duy nhất tương tác quá khứ. Bash có bộ ký hiệu tắt phong phú cho phép hồi tưởng và thậm chí sửa đổi lệnh trong lịch sử shell.

Ví dụ, chạy lại lệnh gần nhất (output của &nbsp;history | tail -n1, dùng space đầu, ký hiệu &nbsp;, để giữ lệnh history khỏi lịch sử), chỉ gõ !! vào Bash:

$ wc -w luarocks.xml
1284 luarocks.xml
$ !!
1284 luarocks.xml

Để chạy lệnh gần nhất thay thế phần lệnh bằng thứ khác, dùng thay thế chuỗi:

$ wc -w luarocks.xml
1284 luarocks.xml
$ ^-w^-l
$ wc -l luarocks.xml
214 luarocks.xml

Nhiều shortcut như vậy, đều có tài liệu trong man và info page của Bash. Thừa nhận, nhiều thủ thuật dành cho user nâng cao mà tương tác Bash lặp lại và đơn điệu đến nỗi tổ hợp phím bí ẩn hữu ích. Zsh mô phỏng Bash hiệu quả, nhưng không shell nào khác cung cấp hiệu quả tối đa này.

Bash so với các shell khác

Lệnh history của Bash không shell nào sánh bằng (Zsh gần nhưng thiếu tùy chọn như xóa theo số dòng).

Mảng liên kết (Associative arrays)

Hầu hết shell cung cấp khả năng tạo, thao tác, truy vấn mảng chỉ số (indexed arrays). Bằng ngôn ngữ đơn giản, mảng chỉ số là danh sách các thứ có tiền tố số. Danh sách đó, cùng số gán, gói gọn trong một biến, dễ "mang" trong code.

Bash tuy nhiên bao gồm khả năng tạo mảng liên kết, và xử lý mảng này như mảng khác. Mảng liên kết cho phép tạo danh sách cặp khóa-giá trị, thay vì chỉ giá trị có số.

Điều hay về mảng liên kết là khóa có thể tùy ý:

$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`

Truy vấn bất kỳ khóa:

$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192

Hầu hết thao tác mảng thông thường đều có sẵn.

Bash so với các shell khác

Bash là shell duy nhất hỗ trợ đầy đủ mảng liên kết (lại Zsh gần nhưng thiếu hàm liệt kê khóa).

Chọn Bash cho shell scripting

Một số tiện ích trong Bash không tuân thủ POSIX. Về lý thuyết, nghĩa là bạn có thể viết script Bash không chạy như mong đợi trên hệ thống không có Bash. Nếu xảy ra, nói script không "di động" (portable).

Thực tế, Bash là phần mềm tự do mã nguồn mở, ai cũng cài được, चाहे Linux, BSD, OpenIndiana, Windows, hay macOS. Cài Bash không yêu cầu user dùng Bash làm shell mặc định, hay thậm chí chủ động chạy nó, vì script tốt xác định shell dùng trong dòng shebang đầu (#!/bin/bash, ví dụ).

Khi băn khoăn, hãy thêm Bash làm dependency của script shell (dù là dependency duy nhất) trong tài liệu để cảnh báo user đó là script Bash không phải shell script chung.

Bash có nhiều tiện ích, tôi thấy chúng lấn át lo ngại về user có cài Bash hay không. Giống Python hay Java hay phần mềm khác, đôi khi có dependency. Nếu bạn thích Bash và thấy tắt tắt và shortcut hữu ích, đừng làm khuyết chính mình.

Tải eBook về Bash scripting cho sysadmin!