GNU/Linux >> Tutoriels Linux >  >> Linux

Comment cat << EOF fonctionne-t-il dans bash?

Le cat <<EOF La syntaxe est très utile lorsque vous travaillez avec du texte multiligne dans Bash, par exemple. lors de l'affectation d'une chaîne multiligne à une variable shell, un fichier ou un tube.

Exemples de cat <<EOF utilisation de la syntaxe dans Bash :

1. Affecter une chaîne multiligne à une variable shell

$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)

Le $sql La variable contient désormais également les caractères de nouvelle ligne. Vous pouvez vérifier avec echo -e "$sql" .

2. Passer une chaîne multiligne à un fichier dans Bash

$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF

Le print.sh le fichier contient maintenant :

#!/bin/bash
echo $PWD
echo /home/user

3. Passer une chaîne multiligne à un tube dans Bash

$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF

Le b.txt le fichier contient bar et baz lignes. La même sortie est imprimée sur stdout .


Cela s'appelle heredoc format pour fournir une chaîne dans stdin. Voir https://en.wikipedia.org/wiki/Here_document#Unix_shells pour plus de détails.

À partir de man bash :

Voici Documents

Ce type de redirection demande au shell de lire l'entrée à partir de la source actuelle jusqu'à ce qu'une ligne contenant uniquement un mot (sans espaces de fin) soit vue.

Toutes les lignes lues jusque-là sont alors utilisées comme entrée standard pour une commande.

Le format des documents ici est :

          <<[-]word
                  here-document
          delimiter

Aucun développement de paramètre, substitution de commande, développement arithmétique ou développement de chemin d'accès n'est effectué sur le mot . Si des caractères dans mot sont cités, ledélimiteur est le résultat de la suppression des guillemets sur mot , et les lignes dans le ici-document ne sont pas développés.Si mot n'est pas entre guillemets, toutes les lignes du document ici sont soumis à l'expansion des paramètres, à la substitution de commandes et à l'expansion arithmétique. Dans ce dernier cas, la suite de caractères \<newline> est ignoré, et \ doit être utilisé pour citer les caractères \ , $ , et ` .

Si l'opérateur de redirection est <<- , alors tous les caractères de tabulation de tête sont supprimés des lignes d'entrée et de la ligne contenant le délimiteur . Cela permet aux documents ici dans les scripts shell d'être indentés de manière naturelle.


Dans votre cas, "EOF" est connu sous le nom de "Here Tag". En gros <<Here indique au shell que vous allez saisir une chaîne multiligne jusqu'à la "balise" Here . Vous pouvez nommer ce tag comme vous voulez, c'est souvent EOF ou STOP .

Quelques règles concernant les balises Here :

  1. La balise peut être n'importe quelle chaîne, majuscule ou minuscule, bien que la plupart des gens utilisent les majuscules par convention.
  2. La balise ne sera pas considérée comme une balise Here s'il y a d'autres mots dans cette ligne. Dans ce cas, il sera simplement considéré comme faisant partie de la chaîne. Le tag doit figurer seul sur une ligne distincte pour être considéré comme un tag.
  3. La balise ne doit comporter aucun espace de début ou de fin sur cette ligne pour être considérée comme une balise. Sinon, il sera considéré comme faisant partie de la chaîne.

exemple :

$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
>  HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string

Linux
  1. Ssh – Comment Tcp-keepalive fonctionne-t-il dans Ssh ?

  2. Que fait 'bash -c' ?

  3. Comment puis-je vérifier les caractères textuels d'une chaîne de commande bash ?

  4. Comment fonctionne l'interface de bouclage

  5. Comment fonctionne le modèle <( cmd ) dans bash ?

Qu'est-ce que NGINX ? Comment ça marche?

Comment vérifier si une chaîne contient une sous-chaîne dans Bash

Comment fonctionne la mémoire d'échange sous Linux ?

Comment fonctionne un débogueur sous Linux ?

Comment fonctionne la commande ps ?

Comment fonctionne l'affichage de Linux ?