Đây là tài liệu ( Heredoc ) là một ký tự đầu vào hoặc dòng tệp được coi như một khối mã đặc biệt. Khối mã này sẽ được chuyển đến một lệnh để xử lý. Heredoc bắt nguồn từ UNIX shell và có thể được tìm thấy trong các shell Linux phổ biến như sh, tcsh, ksh, bash, zsh, csh. Đáng chú ý, các ngôn ngữ lập trình khác như Perl, Ruby, PHP cũng hỗ trợ heredoc.
Cấu trúc của Herdoc
Heredoc sử dụng 2 dấu ngoặc nhọn (<<)
theo sau là mã thông báo dấu phân cách . Mã dấu phân tách tương tự sẽ được sử dụng để kết thúc khối mã. Bất cứ thứ gì nằm trong dấu phân cách đều được coi là một khối mã.
Nhìn vào ví dụ dưới đây. Tôi đang chuyển hướng khối mã đến lệnh mèo. Tại đây, dấu phân cách được đặt thành “ KHỐI ”Và được kết thúc bởi cùng một“ BLOCK “.
cat << BLOCK Hello world Today date is $(date +%F) My home directory = ${HOME} BLOCK
LƯU Ý :Bạn nên sử dụng cùng một mã thông báo dấu phân cách để bắt đầu khối và kết thúc khối.
Tạo nhận xét nhiều dòng
Nếu bây giờ bạn đang viết mã trong bash, bạn có thể biết bash theo mặc định không hỗ trợ nhận xét nhiều dòng như C hoặc Java . Bạn có thể sử dụng HereDoc để khắc phục điều này.
Đây không phải là một tính năng tích hợp sẵn của bash hỗ trợ bình luận nhiều dòng mà chỉ là một bản hack. Nếu bạn không chuyển hướng heredoc đối với bất kỳ lệnh nào, trình thông dịch sẽ chỉ đọc khối mã và sẽ không thực thi bất kỳ điều gì.
<< COMMENT This is comment line 1 This is comment line 2 This is comment line 3 COMMENT
Xử lý khoảng trắng
Theo mặc định, heredoc sẽ không loại bỏ bất kỳ ký tự khoảng trắng nào (tab, dấu cách). Chúng tôi có thể ghi đè hành vi này bằng cách thêm dash (-)
sau (<<)
theo sau là dấu phân cách. Điều này sẽ ngăn chặn tất cả các khoảng trắng tab nhưng các khoảng trắng sẽ không bị chặn.
cat <<- BLOCK This line has no whitespace. This line has 2 white spaces at the beginning. This line has a single tab. This line has 2 tabs. This line has 3 tabs. BLOCK
Biến và Lệnh phụ
Heredoc chấp nhận thay thế biến. Các biến có thể là biến do người dùng xác định hoặc biến môi trường.
TODAY=$(date +%F) cat << BLOCK1 # User defined variables Today date is = ${TODAY} #Environ Variables I am running as = ${USER} My home dir is = ${HOME} I am using ${SHELL} as my shell BLOCK1
Tương tự, bạn có thể chạy bất kỳ lệnh nào bên trong heredoc khối mã.
cat << BLOCK2 $(uname -a) BLOCK2
Thoát khỏi các ký tự đặc biệt
Có một số cách để chúng ta có thể thoát khỏi các ký tự đặc biệt. Bạn có thể làm điều đó ở cấp độ ký tự hoặc cấp độ tài liệu.
Để thoát các ký tự đặc biệt riêng lẻ, hãy sử dụng dấu gạch chéo ngược (\) .
cat << BLOCK4 $(uname -a) BLOCK4 cat << BLOCK5 Today date is = ${TODAY} BLOCK5
Để thoát khỏi tất cả các ký tự đặc biệt bên trong khối, hãy bao quanh dấu phân cách bằng dấu nháy đơn, dấu ngoặc kép hoặc dấu phân cách tiền tố với dấu gạch chéo ngược.
cat << 'BLOCK1' I am running as = ${USER} BLOCK1 cat << "BLOCK2" I am running as = ${USER} BLOCK2 cat << \BLOCK3 I am running as = ${USER} BLOCK3
Bây giờ chúng ta đã biết cấu trúc của heredoc và cách thức hoạt động, hãy cùng xem một vài ví dụ. Hai lĩnh vực phổ biến mà tôi sử dụng heredoc đang chạy một khối lệnh qua SSH và chuyển các truy vấn SQL qua heredoc .
Trong ví dụ dưới đây, chúng tôi đang cố gắng thực thi một khối mã trong máy chủ từ xa thông qua SSH.
Trong ví dụ dưới đây, tôi đang chuyển một lựa chọn tuyên bố cho psql để kết nối với cơ sở dữ liệu và chạy truy vấn. Đây là một cách thay thế để chạy truy vấn trong psql bên trong tập lệnh bash thay vì sử dụng -f
cờ để chạy .sql tệp.
#!/usr/bin/env bash UNAME=postgres DBNAME=testing psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK SELECT * FROM COUNTRIES WHERE region_id = 4; BLOCK
Đó là nó cho bài viết này. Bạn có thể làm được nhiều việc hơn với heredoc so với những gì chúng tôi đã trình bày trong các ví dụ. Nếu bạn có bất kỳ bản hack hữu ích nào với heredoc vui lòng đăng nó trong phần bình luận để độc giả của chúng tôi có thể hưởng lợi từ điều đó.