GNU/Linux >> Linux Esercitazione >  >> Linux

Come funziona cat << EOF in bash?

Il cat <<EOF la sintassi è molto utile quando si lavora con testo su più righe in Bash, ad es. quando si assegna una stringa multilinea a una variabile di shell, file o pipe.

Esempi di cat <<EOF utilizzo della sintassi in Bash:

1. Assegna una stringa multilinea a una variabile di shell

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

Il $sql variabile ora contiene anche i caratteri di nuova riga. Puoi verificare con echo -e "$sql" .

2. Passa una stringa multilinea a un file in Bash

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

Il print.sh il file ora contiene:

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

3. Passa una stringa multilinea a una pipe in Bash

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

Il b.txt il file contiene bar e baz linee. Lo stesso output viene stampato su stdout .


Questo si chiama heredoc format per fornire una stringa in stdin. Vedi https://en.wikipedia.org/wiki/Here_document#Unix_shells per maggiori dettagli.

Da man bash :

Qui Documenti

Questo tipo di reindirizzamento istruisce la shell a leggere l'input dalla sorgente corrente finché non viene vista una riga contenente solo parole (senza spazi vuoti).

Tutte le righe lette fino a quel punto vengono quindi utilizzate come input standard per un comando.

Il formato degli here-documents è:

          <<[-]word
                  here-document
          delimiter

Nessuna espansione di parametro, sostituzione di comando, espansione aritmetica o espansione di percorso viene eseguita suparola . Se ci sono caratteri in word sono tra virgolette, il delimitatore è il risultato della rimozione delle virgolette su parola e le righe nel here-document non sono espansi.Se parola non è quotato, tutte le righe del qui-documento sono soggetti all'espansione dei parametri, alla sostituzione dei comandi e all'espansione aritmetica. In quest'ultimo caso, la sequenza di caratteri \<newline> isignored e \ deve essere utilizzato per citare i caratteri \ , $ e ` .

Se l'operatore di reindirizzamento è <<- , quindi tutti i caratteri di tabulazione iniziali vengono rimossi dalle righe di input e dalla riga contenente il delimitatore . Ciò consente ai documenti here all'interno degli script di shell di essere indentati in modo naturale.


Nel tuo caso, "EOF" è noto come "Here Tag". Fondamentalmente <<Here dice alla shell che stai per inserire una stringa multilinea fino al "tag" Here . Puoi nominare questo tag come preferisci, spesso è EOF o STOP .

Alcune regole sui tag Here:

  1. Il tag può essere qualsiasi stringa, maiuscolo o minuscolo, anche se la maggior parte delle persone usa il maiuscolo per convenzione.
  2. Il tag non verrà considerato come un tag Here se ci sono altre parole in quella riga. In questo caso, sarà semplicemente considerato parte della stringa. Il tag dovrebbe essere da solo su una riga separata, per essere considerato un tag.
  3. Il tag non deve avere spazi iniziali o finali in quella riga per essere considerato un tag. Altrimenti sarà considerato come parte della stringa.

esempio:

$ 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. Cos'è NGINX? Come funziona?

  2. Cosa fa 'bash -c'?

  3. Come posso controllare i caratteri letterali di una stringa di comando bash?

  4. Come funziona un debugger in Linux?

  5. Come funziona il comando ps?

Come verificare se una stringa contiene una sottostringa in Bash

Come funziona Awk '!a[$0]++'?

Ssh – Come funziona Tcp-keepalive in Ssh?

Come funziona la memoria di scambio in Linux?

Come funziona il pattern <( cmd ) in bash?

Come funziona il display di Linux?