GNU/Linux >> Znalost Linux >  >> Linux

Jak funguje cat << EOF v bash?

cat <<EOF syntaxe je velmi užitečná při práci s víceřádkovým textem v Bash, např. při přiřazování víceřádkového řetězce proměnné shellu, souboru nebo kanálu.

Příklady cat <<EOF použití syntaxe v Bash:

1. Přiřaďte víceřádkový řetězec proměnné shellu

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

$sql proměnná nyní obsahuje i znaky nového řádku. Můžete ověřit pomocí echo -e "$sql" .

2. Předat víceřádkový řetězec do souboru v Bash

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

print.sh soubor nyní obsahuje:

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

3. Předejte víceřádkový řetězec do roury v Bash

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

b.txt soubor obsahuje bar a baz linky. Stejný výstup se vytiskne na stdout .


Říká se tomu heredoc formát pro poskytnutí řetězce do stdin. Další podrobnosti najdete na https://en.wikipedia.org/wiki/Here_document#Unix_shells.

Od man bash :

Zde dokumenty

Tento typ přesměrování instruuje shell, aby četl vstup z aktuálního zdroje, dokud není vidět řádek obsahující pouze slovo (bez koncových mezer).

Všechny řádky přečtené do tohoto bodu jsou pak použity jako standardní vstup pro příkaz.

Formát dokumentů zde je:

          <<[-]word
                  here-document
          delimiter

Naslovo se neprovádí žádné rozšiřování parametrů, substituce příkazů, aritmetické rozšiřování ani rozšiřování názvu cesty . Pokud jsou ve slovu nějaké znaky jsou citovány,oddělovač je výsledkem odstranění uvozovek na word a řádky v zde-dokumentu nejsou rozbaleny.Pokud slovo je bez uvozovek, všechny řádkyzde-dokumentu jsou vystaveny expanzi parametrů, substituci příkazů a aritmetické expanzi. V druhém případě sekvence znaků \<newline> ignorováno a \ musí být použito k uvozování znaků \ , $ a ` .

Pokud je operátor přesměrování <<- , pak jsou ze vstupních řádků a řádku obsahujícího oddělovač odstraněny všechny znaky tabulátoru . To umožňuje, aby byly dokumenty ve skriptech shellu odsazeny přirozeným způsobem.


Ve vašem případě je „EOF“ známý jako „Here Tag“. V podstatě <<Here říká shellu, že se chystáte zadat víceřádkový řetězec, dokud nebude "tag" Here . Tuto značku můžete pojmenovat, jak chcete, často je to EOF nebo STOP .

Některá pravidla o značkách Here:

  1. Značkou může být libovolný řetězec, velká nebo malá písmena, ačkoli většina lidí používá velká písmena podle konvence.
  2. Značka nebude považována za značku Here, pokud jsou v tomto řádku jiná slova. V tomto případě bude považována pouze za součást řetězce. Značka by měla být sama o sobě na samostatném řádku, aby byla považována za značku.
  3. Aby značka mohla být považována za značku, neměla by mít na začátku ani na konci mezery. Jinak bude považován za součást řetězce.

příklad:

$ 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. Co je NGINX? Jak to funguje?

  2. Jak Awk ‚!a[$0]++‘ funguje?

  3. Jak Sticky Bit funguje?

  1. Jak zkontrolovat, zda řetězec obsahuje podřetězec v Bash

  2. Jak rm funguje? Co dělá rm?

  3. Jak vlastně sig_atomic_t funguje?

  1. Jak mohu zkontrolovat doslovné znaky řetězce příkazu bash?

  2. Jak funguje debugger v Linuxu?

  3. Jak funguje rozhraní zpětné smyčky