Como usar o heredoc em script de shell

Como usar o heredoc em script de shell

Aqui documento (Heredoc) é um literal de fluxo de entrada ou arquivo que é tratado como um bloco especial de código. Este bloco de código será passado para um comando para processamento. Heredoc origina em Unix conchas e pode ser encontrado em conchas populares Linux como SH, TCSH, KSH, BASH, ZSH, CSH. Notavelmente, outras linguagens de programação, como Perl, Ruby, PHP, também suportam Heredoc.

Estrutura de Herdoc

Heredoc usa 2 suportes de ângulo (<<) seguido por a Token de delimitador. O mesmo token delimitador será usado para encerrar o bloco de código. O que quer que esteja dentro do delimitador é considerado um bloco de código.

Veja o exemplo abaixo. Estou redirecionando o bloco de código para o comando CAT. Aqui o delimitador está definido como “BLOQUEAR”E encerrado pelo mesmo“BLOQUEAR““.

gato << BLOQUEAR Hello World Today Data é $ (data +%f) meu diretório doméstico = $ home BLOQUEAR 

OBSERVAÇÃO: Você deve usar o mesmo token delimitador para iniciar o bloco e encerrar o bloco.

Crie comentários multilinas

Se você está codificando em algum momento em Bash agora, pode saber Bash por padrão não suporta comentários multilinas como C ou Java. Você pode usar Heredoc para superar isso.

Este não é um recurso interno do Bash suportando comentários de várias linhas, mas apenas um hack. Se você não está redirecionando heredoc Para qualquer comando, o intérprete simplesmente lerá o bloco de código e não executará nada.

<< COMENTE Esta é a linha de comentários 1 Esta é a linha de comentários 2 Esta é a linha de comentários 3 COMENTE 
Comentários multilinas

Lidar com espaços brancos

Por padrão, heredoc não suprimirá nenhum caractere do espaço branco (guias, espaços). Podemos substituir esse comportamento adicionando traço (-) depois (<<) seguido por um delimitador. Isso suprimirá todos os espaços de guias, mas os espaços brancos não serão suprimidos.

gato <<- 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 
Espaços de manuseio

Variável e substituição de comando

Heredoc aceita substituição variável. Variáveis ​​podem ser variáveis ​​definidas pelo usuário ou variáveis ​​ambientais.

Hoje = $ (data +%f) gato << 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 

Da mesma forma, você pode executar quaisquer comandos dentro do heredoc bloco de código.

gato << BLOCK2 $(uname -a) BLOCK2 
Variável e substituição de comando

Escapar de personagens especiais

Existem várias maneiras de escapar de personagens especiais. Ou você pode fazer isso no nível do personagem ou no nível do documento.

Para escapar de caracteres especiais individuais, use um barragem (\).

gato << BLOCK4 $(uname -a) BLOCK4 cat << BLOCK5 Today date is = $TODAY BLOCK5 

Para escapar de todos os caracteres especiais dentro do bloco, cercam o delimitador com citações únicas, citações duplas ou delimitador de prefixo com uma barra de barriga.

gato << 'BLOCK1' I am running as = $USER BLOCK1 cat << "BLOCK2" I am running as = $USER BLOCK2 cat << \BLOCK3 I am running as = $USER BLOCK3 
Escapar de personagens especiais

Agora que conhecemos a estrutura de heredoc E como funciona, vamos ver alguns exemplos. Duas áreas comuns onde eu uso heredoc estão executando um bloco de comandos sobre o SSH e passando por consultas SQL através heredoc.

No exemplo abaixo, estamos tentando executar um bloco de código em um servidor remoto através do SSH.

Executando comandos sobre SSH

No exemplo abaixo, estou passando um Selecione declaração para PSQL para conectar -se a um banco de dados e executar a consulta. Esta é uma maneira alternativa de executar uma consulta em PSQL script bash interno em vez de usar o -f bandeira para executar .SQL arquivo.

#!/usr/bin/Env bash uname = pósgres dbname = testando psql --username = $ uname - -password -dbname = $ dbName << BLOCK SELECT * FROM COUNTRIES WHERE region_id = 4; BLOCK 
Executando a consulta SQL

É isso para este artigo. Há muito mais que você pode fazer com heredoc comparado ao que mostramos nos exemplos. Se você tem algum truque útil com heredoc Por favor, poste -o na seção de comentários para que nossos leitores possam se beneficiar disso.