Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

HEREDOC (Tại đây Tài liệu) trong Bash và Linux Shell - Hướng dẫn

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.