# HereDoc



- **Commande** - Toute commande (chat, wc, courrier, etc.) qui accepte la redirection.
- **Opérateur de redirection (`<<`)** - L'opérateur par défaut pour HereDoc est `**<<**`. Il redirige le bloc de code vers la commande pour le traitement.
- **Delimiter Token** - The delimiter token denotes the start and end of the document (code block). The delimiter token can be anything but it should be identical. Typically you will see `EOF` is used as delimiter 



#### Afficher une chaîne multi-ligne avec HereDoc

```bash
$ cat << EOF
Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.EOF
heredoc
EOF

Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.EOF
heredoc
```

#### Compter des lignes

```bash
$ wc -l << BLK
Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.EOF
heredoc
BLK

5
```

#### Redirection et pipe

```bash
$ cat << EOF > /tmp/heredoc.txt
Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.
EOF

$ bat /tmp/heredoc.txt
Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.
```

#### Suppression des Tab

Faire suivre l'opérateur de redirection par "-"

```bash
$ cat <<- err_msg
	Souvent, pour s’amuser, les hommes d’équipage
	Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
	Le navire glissant sur les gouffres amers.
err_msg

Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.
```

#### Expansion de variables et commandes

```bash
AUTHOR="OSTechNix"

cat << EOF
Author: ${AUTHOR}                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Author: OSTechNix                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the /bin/zsh shell      # ENV VARIABLE
bruno                          		 # EXTERNAL COMMAND
```

Supprimer l'expansion (cat << 'EOF'):

```bash
AUTHOR="OSTechNix"

cat << 'EOF'
Author: ${AUTHOR}                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Author: ${AUTHOR}                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
```

#### Commentaire multi-lignes:

```bash
: << 'COMMENTS'
Souvent, pour s’amuser, les hommes d’équipage
Prennent des albatros, vastes oiseaux des mers,
Qui suivent, indolents compagnons de voyage,
Le navire glissant sur les gouffres amers.
COMMENTS

```

#### Echapper les caractères spéciaux:

```bash
# SINGLE QUOTES ESCAPE
cat << 'EOF'
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND

# DOUBLE QUOTES ESCAPE
cat << "EOF"
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND

# BACKSLASH ESCAPE
cat << \EOF
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND

# BACKSLASH ESCAPE (one charactere)
cat << EOF
I am using the \${SHELL} shell      # ENV VARIABLE
$(whoami)                           # EXTERNAL COMMAND
EOF

I am using the ${SHELL} shell       # ENV VARIABLE
bruno                          			# EXTERNAL COMMAND
```



### Exemples d'utilisation:

```bash
$ ssh -T user@host << EOF
Command 1...
Command 2..
.....
Command N..
EOF
```

```bash
# add -T flag to ssh command which will disable pseudo-terminal allocation.

declare -a server=( host1 host2 host3 )
for host in ${server[@]}
do
  ssh -T user@${host} << EOF
  echo "Running at host - ${host}"
  if [[ ! -f /home/ostechnix/test ]];then
    touch /home/ostechnix/test
    echo "File Created"
  else
    echo "File exists"
  fi
EOF
done
```

