Khi viết kịch bản shell bạn có thể trong một tình huống mà bạn cần phải vượt qua một khối multiline của văn bản hoặc mã với một lệnh tương tác, chẳng hạn như tee
, cat
hoặc sftp
.
Trong Bash và các trình bao khác như Zsh, tài liệu Tại đây (Heredoc) là một loại chuyển hướng cho phép bạn chuyển nhiều dòng đầu vào cho một lệnh.
Cú pháp viết HereDoc có dạng sau:
[COMMAND] <<[-] 'DELIMITER' HERE-DOCUMENT DELIMITER
- Dòng đầu tiên bắt đầu bằng một lệnh tùy chọn, theo sau là toán tử chuyển hướng đặc biệt
<<
và số nhận dạng phân tách.- Bạn có thể sử dụng bất kỳ chuỗi nào làm mã định danh phân tách, thường được sử dụng nhất là EOF hoặc END.
- Nếu mã định danh phân tách không được trích dẫn, trình bao sẽ thay thế tất cả các biến, lệnh và ký tự đặc biệt trước khi chuyển các dòng tài liệu tại đây đến lệnh.
- Thêm dấu trừ vào toán tử chuyển hướng
<<-
sẽ khiến tất cả các ký tự đầu tab bị bỏ qua. Điều này cho phép bạn sử dụng thụt lề khi viết tài liệu tại đây trong các tập lệnh shell. Các ký tự khoảng trắng ở đầu không được phép, chỉ có tab.
- Khối tài liệu ở đây có thể chứa chuỗi, biến, lệnh và bất kỳ loại đầu vào nào khác.
- Dòng cuối cùng kết thúc bằng số phân định. Khoảng trắng phía trước dấu phân cách không được phép.
Ví dụ cơ bản về Heredoc
Trong phần này, chúng ta sẽ xem xét một số ví dụ cơ bản về cách sử dụng heredoc.
Heredoc thường được sử dụng kết hợp với lệnh cat .
Trong ví dụ sau, chúng ta đang chuyển hai dòng văn bản chứa một biến môi trường và một lệnh để cat
sử dụng tài liệu here.
cat << EOF The current working directory is: $PWD You are logged in as: $(whoami) EOF
Như bạn có thể thấy từ đầu ra bên dưới, cả biến và đầu ra lệnh đều được thay thế:
The current working directory is: /home/hocdevops You are logged in as: hocdevops
Hãy xem điều gì sẽ xảy ra nếu chúng ta đặt dấu phân cách trong dấu ngoặc kép hoặc đơn.
cat <<- "EOF" The current working directory is: $PWD You are logged in as: $(whoami) EOF
Bạn có thể nhận thấy rằng khi dấu phân cách được trích dẫn thì không có trình bao nào thực hiện mở rộng tham số và thay thế lệnh.
The current working directory is: $PWD You are logged in as: $(whoami)
Nếu bạn đang sử dụng heredoc bên trong một câu lệnh hoặc vòng lặp, hãy sử dụng <<-
thao tác chuyển hướng cho phép bạn thụt lề mã của mình.
if true; then cat <<- EOF Line with a leading tab. EOF fi
Output:
Line with a leading tab.
Thay vì hiển thị kết quả trên màn hình, bạn có thể chuyển hướng nó vào một tập tin bằng cách sử dụng >
, >>
khai thác.
cat << EOF > file.txt The current working directory is: $PWD You are logged in as: $(whoami) EOF
Nếu file.txt không tồn tại, nó sẽ được tạo. Khi sử dụng >
tệp sẽ bị ghi đè, trong khi tệp >>
sẽ nối đầu ra vào tệp.
Đầu vào heredoc cũng có thể được nối. Trong ví dụ sau, sed
lệnh sẽ thay thế tất cả các trường hợp của l
ký tự bằng e
:
cat <<'EOF' | sed 's/l/e/g' Hello World EOF
Output:
Heeeo Wored
Để ghi dữ liệu đường ống vào một tệp:
cat <<'EOF' | sed 's/l/e/g' > file.txt Hello World EOF
Sử dụng Heredoc với SSH
Sử dụng Heredoc là một trong những cách thuận tiện và dễ dàng nhất để thực hiện nhiều lệnh trên một hệ thống từ xa qua SSH .
Khi sử dụng dấu phân cách không được trích dẫn, hãy đảm bảo rằng bạn thoát khỏi tất cả các biến, lệnh và ký tự đặc biệt, nếu không chúng sẽ được nội suy cục bộ:
ssh -T user@host.com << EOF echo "The current local working directory is: $PWD" echo "The current remote working directory is: \$PWD" EOF
Output:
The current local working directory is: /home/devops The current remote working directory is: /home/user
Bạn cũng có thể muốn thiết lập xác thực dựa trên khóa SSH và kết nối với máy chủ Linux của mình mà không cần nhập mật khẩu.
Phần kết luận
Trong hướng dẫn này, bạn đã biết được là gì heredoc
và cách sử dụng nó trong các tập lệnh shell của bạn.
Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng để lại bình luận.