GNU/Linux >> Znalost Linux >  >> Linux

Bash Heredoc

Při psaní shell skriptů se můžete dostat do situace, kdy potřebujete předat víceřádkový blok textu nebo kódu interaktivnímu příkazu, jako je tee , cat nebo sftp .

V Bash a dalších shellech, jako je Zsh, je dokument Here (Heredoc) typem přesměrování, který vám umožňuje předat příkazu více řádků vstupu.

Syntaxe psaní HereDoc má následující podobu:

[COMMAND] <<[-] 'DELIMITER'
  HERE-DOCUMENT
DELIMITER
  • První řádek začíná volitelným příkazem, za nímž následuje speciální operátor přesměrování << a oddělovací identifikátor.
    • Jako oddělovací identifikátor můžete použít libovolný řetězec, nejčastěji používané jsou EOF nebo END.
    • Pokud oddělovací identifikátor není v uvozovkách, shell nahradí všechny proměnné, příkazy a speciální znaky před předáním řádků dokumentu zde příkazu.
    • Přidání znaménka mínus k operátoru přesměrování <<- , způsobí, že všechny úvodní znaky tabulátoru budou ignorovány. To vám umožňuje používat odsazení při psaní dokumentů zde ve skriptech shellu. Úvodní mezery nejsou povoleny, pouze tabulátor.
  • Blok dokumentu zde může obsahovat řetězce, proměnné, příkazy a jakýkoli jiný typ vstupu.
  • Poslední řádek končí oddělovacím identifikátorem. Bílé místo před oddělovačem není povoleno.

Základní příklady Heredoc #

V této části se podíváme na některé základní příklady použití heredoc.

Heredoc se nejčastěji používá v kombinaci s příkazem cat.

V následujícím příkladu předáváme dva řádky textu obsahující proměnnou prostředí a příkaz cat pomocí dokumentu zde.

cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

Jak můžete vidět z výstupu níže, proměnná i výstup příkazu jsou nahrazeny:

The current working directory is: /home/linuxize
You are logged in as: linuxize

Podívejme se, co se stane, když oddělovač uzavřeme do jednoduchých nebo dvojitých uvozovek.

cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

Můžete si všimnout, že když je uvozován oddělovač, shell neprovádí žádné rozšiřování parametrů a nahrazování příkazů.

The current working directory is: $PWD
You are logged in as: $(whoami)

Pokud používáte heredoc uvnitř příkazu nebo smyčky, použijte <<- operace přesměrování, která vám umožní odsadit váš kód.

if true; then
    cat <<- EOF
    Line with a leading tab.
    EOF
fi
Line with a leading tab.

Místo zobrazení výstupu na obrazovce jej můžete přesměrovat do souboru pomocí > , >> operátory.

cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

Pokud soubor.txt neexistuje, bude vytvořen. Při použití > soubor bude přepsán, zatímco >> připojí výstup k souboru.

Vstup heredoc lze také převést potrubím. V následujícím příkladu sed příkaz nahradí všechny výskyty l znak s e :

cat <<'EOF' |  sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored

Chcete-li zapsat přenesená data do souboru:

cat <<'EOF' |  sed 's/l/e/g' > file.txt
Hello
World
EOF

Použití Heredocu s SSH #

Použití Heredoc je jedním z nejpohodlnějších a nejjednodušších způsobů, jak provádět více příkazů na vzdáleném systému přes SSH.

Při použití oddělovače bez uvozovek se ujistěte, že jste escapovali všechny proměnné, příkazy a speciální znaky, jinak budou interpolovány lokálně:

ssh -T [email protected] << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
The current local working directory is: /home/linuxize
The current remote working directory is: /home/user

Můžete také chtít nastavit ověřování na základě klíče SSH a připojit se k serverům Linux bez zadávání hesla.

Závěr č.

V této příručce jste se naučili, co je heredoc a jak jej používat ve skriptech shellu.

Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.


Linux
  1. Příkaz „eval“ v Bash?

  2. bash sh - příkaz nenalezen

  3. Spusťte příkaz bash na jenkins pipeline

  1. spouštění apachectl z bash

  2. Bash, pokud na jednom řádku

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

  1. Vysvětlení příkazu Bash trap

  2. příkaz pro export bash

  3. Bash - příkaz Datum a mezera