Bài viết này sẽ hướng dẫn bạn cách sử dụng Heredoc ( Tài liệu tại đây ) trong tập lệnh Bash / Shell để làm việc với văn bản nhiều dòng.
Heredocs hữu ích nhất để chấp nhận đầu vào nhiều dòng - người dùng có thể nhập một dòng văn bản, nhấn enter, sau đó nhập dòng tiếp theo, v.v. Nó cũng có thể được sử dụng để xác định văn bản nhiều dòng trong tập lệnh.
Nó cũng có thể gửi nhiều lệnh vào một chương trình tương tác - điều này sẽ được trình bày trong các ví dụ sau.
Các ví dụ trong bài viết này sẽ hoạt động trên cả Bash và Zsh Shells.
Đầu vào chuẩn, đường ống và chuyển hướng
Heredoc thường được sử dụng với Đầu vào / Đầu ra Chuẩn và chuyển hướng / đường ống để gửi văn bản nhiều dòng tới các lệnh khác để xử lý, định dạng hoặc hiển thị. Chủ đề này thực sự cần một bài báo cho chính nó để giải thích khái niệm, vì vậy đây là:
Chuyển hướng stdin, stdout, stderr trong Linux / Bash, có ví dụ
Các ví dụ dưới đây sẽ sử dụng các khái niệm và phương pháp được đề cập trong bài viết trên ở một số điểm.
Cú pháp Heredoc Bash / Zsh
Để bắt đầu Heredoc , bạn chỉ cần sử dụng << yêu cầu. Đây là một dạng chuyển hướng Đầu vào / Đầu ra đã nêu ở trên.
Cú pháp để sử dụng Heredoc như sau:
COMMAND <<LIMITSTRING text line 1 text line 2 ... LIMITSTRING
Lưu ý rằng:
- LỆNH có thể là bất kỳ lệnh hoặc tập lệnh Linux nào - nội dung của văn bản có trong heredoc sẽ được gửi đến nó bằng cách sử dụng chuyển hướng
- << Xác định phần đầu của câu lệnh Heredoc
- Nếu bạn định thụt lề văn bản nhiều dòng, hãy sử dụng <<- (lưu ý dấu gạch ngang đã thêm) thay vào đó - nó sẽ tách các tab đầu dòng khỏi mỗi dòng
- LIMITSTRING là chuỗi phải được nhập để kết thúc việc nhập văn bản cho Heredoc
- Vì Heredocs có nhiều dòng, khi người dùng nhấn phím ENTER để chuyển sang dòng tiếp theo, bạn không thể nhấn enter để ngừng nhập văn bản mới.
- LIMITSTRING , khi xuất hiện, cho Heredoc biết rằng bạn đã nhập xong văn bản và kết thúc
- Nó có thể là bất cứ thứ gì - đảm bảo bạn sử dụng một loạt ký tự không cần thiết xuất hiện trong văn bản của mình để không bị kết thúc sớm.
- Một phương pháp phổ biến là sử dụng văn bản EOF (viết tắt của E nd O f F ile) là LIMITSTRING - miễn là văn bản này sẽ không xuất hiện bên trong Heredoc.
- Bạn có thể có bao nhiêu dòng văn bản tùy thích
Ví dụ về Heredoc
Chấp nhận kiểu nhập văn bản nhiều dòng
Ví dụ này sẽ chấp nhận nhiều dòng văn bản và gửi chúng đến con mèo lệnh cho hiển thị:
cat <<EOF This is line 1 This is line 2 EOF
Ví dụ trên phải được nhập vào chương trình đầu cuối của bạn.
Sử dụng các biến
Bạn có thể sử dụng các biến shell trong Heredoc của mình:
cat <<EOF This is line 1 This is line 2 Your current directory is $PWD EOF
Ở trên, biến $ PWD được hiển thị ở một trong các dòng của Heredoc - biến này giữ giá trị của thư mục làm việc hiện tại.
Chuyển hướng đầu ra của Heredoc
Chuyển hướng tiêu chuẩn (xem phần trước của bài viết nếu bạn không biết đây là gì) có thể được sử dụng để gửi nội dung của Heredoc sau khi nó đã được gửi đến COMMAND tới một chương trình hoặc tệp khác:
cat <<EOF > output.txt This is line 1 This is line 2 Your current directory is $PWD EOF
Ở trên, cat đọc nội dung của Heredoc và đầu ra của cat được chuyển hướng và ghi vào tệp output.txt bằng cách sử dụng > lệnh.
Xác định văn bản nhiều dòng trong tập lệnh
Bạn có thể sử dụng Heredoc trong một tập lệnh. Vì một tập lệnh shell chỉ là một danh sách các lệnh từng dòng được đưa vào shell, nó sẽ hoạt động theo cùng một cách.
Thật tuyệt khi có thể thụt lề mã tập lệnh của bạn - nếu bạn không muốn các tab đó xuất hiện trong văn bản của mình, bạn có thể thêm - (gạch ngang) vào phần khai báo Heredoc của bạn để loại bỏ bất kỳ khoảng trắng nào ở đầu mỗi dòng:
#!/bin/bash if $trueOrFalse; then cat <<-EOF > output.txt This is line 1 This is line 2 Your current directory is $PWD EOF fi #!/bin/bash
Gán một Heredoc cho một biến
Bạn có thể gán văn bản nhiều dòng trong Heredoc cho một biến tập lệnh bằng cách đọc nó với cat lệnh và gán đầu ra cho một biến như sau:
mytext=$(cat <<-EOF This is line 1 This is line 2 Your current directory is $PWD EOF ) echo $mytext
Gửi nhiều lệnh tới một chương trình tương tác
Heredocs cũng có thể gửi nhiều dòng văn bản tới một chương trình tương tác. Một số chương trình, sau khi được khởi chạy, yêu cầu bạn nhập các lệnh của riêng mình - chúng có thể chấp nhận văn bản để xử lý hoặc cung cấp trình bao của riêng chúng để phát lệnh.
Một ví dụ về điều này là MySQL - khi MySQL đã khởi chạy và kết nối với máy chủ, bạn có thể nhập các lệnh của riêng mình, sau đó là phím enter để truy vấn dữ liệu. Bằng cách sử dụng Heredoc, bạn có thể viết sẵn các lệnh này và gửi chúng vào MySQL mà không cần người dùng tương tác:
mysql -uUSERNAME -pPASSWORD DATABASE <<EOF SHOW TABLES; SELECT * FROM posts; EOF
Ở trên, MySQL lệnh được sử dụng để kết nối với một DATABASE đã cho với USERNAME và PASSWORD.
Sau đó, hai lệnh tuần tự sẽ được đưa ra khi kết nối sẵn sàng - một lệnh để HIỂN THỊ BẢNG và một để CHỌN tất cả các bản ghi từ bài đăng bảng.