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

Cách sử dụng Heredoc trong Shell Scripting

Đâ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
Cách sử dụng Heredoc trong Shell Scripting

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
Cách sử dụng Heredoc trong Shell Scripting

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
Cách sử dụng Heredoc trong Shell Scripting Cách sử dụng Heredoc trong Shell Scripting

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
Cách sử dụng Heredoc trong Shell Scripting

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.

Cách sử dụng Heredoc trong Shell Scripting

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
Cách sử dụng Heredoc trong Shell Scripting

Đó 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 đó.