Úvod
Dokument zde (HereDoc ) je část kódu, která funguje jako samostatný soubor. HereDoc je víceřádkový řetězec nebo souborový literál pro odesílání vstupních proudů do jiných příkazů a programů.
HereDocs jsou zvláště užitečné při přesměrování více příkazů najednou, což pomáhá dělat skripty Bash přehlednější a snáze pochopitelné.
Tento článek vás naučí základy používání notace HereDoc a některé typické případy použití.
Předpoklady
- Přístup k příkazovému řádku/terminálu jako uživatel sudo.
- Textový editor pro psaní skriptů Bash.
- Základní příkazy systému Linux. Pro rychlou orientaci si stáhněte náš cheat sheet pro příkazy Linuxu.
Syntaxe Bash HereDoc
Syntaxe pro psaní HereDoc je:
[COMMAND] <<[-] 'DELIMITER'
Line 1
Line 2
...
DELIMITER
Skládá se z následujících prvků:
COMMAND
je volitelný. Funguje pro jakýkoli příkaz, který přijímá přesměrování.<<
je operátor přesměrování pro předání HereDoc doCOMMAND
.-
je parametr pro potlačení tabulátoru.DELIMITER
v prvním řádku definuje oddělovací token HereDoc.END
,EOT
aEOF
jsou nejběžnější, ale funguje každé víceznakové slovo, které se neobjeví v těle. Vynechejte jednoduché uvozovky na prvním řádku, abyste umožnili rozšíření příkazů a proměnných.- Položka
DELIMITER
v posledním řádku označuje konec HereDoc. Použijte stejné slovo z prvního řádku bez úvodních mezer.
Samotný HereDoc obsahuje libovolný počet řádků s řetězci, proměnnými, příkazy a dalšími vstupy.
Příklady Bash HereDoc
Tato část ukazuje, jak používat notaci HereDoc v různých situacích. Nejčastějším případem použití je příkaz cat.
Víceřádkový řetězec
Otevřete terminál a zadejte následující text stisknutím Enter za každým řádkem:
cat << EOF
Hello
World
EOF
cat
příkaz přečte HereDoc a zapíše obsah do terminálu.
Variable Expansion
HereDoc přijímá použití proměnných a čte je.
Chcete-li vidět, jak to funguje, vytvořte v terminálu dvě proměnné:
var1="Hello"
var2="World"
Předejte HereDoc cat
příkaz k tisku dvou proměnných spolu s proměnnou prostředí:
cat << END
$var1
$var2
$PWD
END
Všechny proměnné se rozbalí a jejich příslušné hodnoty se vytisknou na terminál.
Rozšíření příkazů
HereDocs přijímají substituci příkazů. Spuštěním následujícího kódu v terminálu řádek po řádku zobrazíte výsledky:
cat << EOF
$(echo Hello)
$(whoami)
EOF
Každý příkaz zahrňte do $()
vyhodnotit prohlášení a získat výsledky. Vynechává se $()
zachází s textem jako s řetězcem.
Ignorovat proměnné a rozšíření příkazů
Přidejte jednoduché nebo dvojité uvozovky k prvnímu oddělovači, abyste ignorovali expanzi proměnných a příkazů v HereDoc.
Například:
cat << "EOF"
$(echo Hello)
$(whoami)
$PWD
EOF
Přidáním uvozovek do oddělovače bude obsah považován za literál HereDoc.
Napojení a přesměrování
Pomocí potrubí nebo přesměrování přepošlete výsledky příkazu jinému příkazu. Vytvořte například skript Bash a přidejte do kanálu příkazu následující obsah:
#!/bin/bash
cat << EOF | base64 -d
SGVsbG8KV29ybGQK
EOF
Případně použijte zápis přesměrování k dosažení stejného výsledku:
#!/bin/bash
(base64 -d) < cat << EOF
SGVsbG8KV29ybGQK
EOF
Spusťte skript Bash, abyste viděli výsledky.
V obou případech jde o výstup z cat
a příkaz HereDoc vede (nebo přesměrovává) na base64 -d
příkaz. Výsledkem je, že skript dekóduje zprávu z HereDoc.
Zapsat do souboru
HereDoc umožňuje psaní víceřádkových dokumentů pomocí jednoho příkazu.
Chcete-li vytvořit soubor a uložit obsah HereDoc, použijte následující formát:
cat << EOF > hello_world.txt
Hello
World
EOF
Pokud dokument neexistuje, příkaz jej vytvoří. Zkontrolujte obsah souboru a potvrďte:
cat hello_world.txt
Konzole zobrazuje obsah souboru.
Potlačení karty
Přidejte pomlčku (-
) po přesměrování potlačit úvodní tabulátory. Vytvořte a spusťte například následující skript:
#!/bin/bash
cat <<- EOF
Hello
World
EOF
Bez potlačení tabulátoru se zpráva vytiskne do konzoly s odsazením. Přidáním pomlčky se odstraní odsazení tabulátoru a zpráva se zobrazí bez úvodních mezer.
Interní příkazy a smyčky
Při práci s HereDoc uvnitř příkazů a smyček mějte na paměti následující chování:
- Kód uvnitř příkazů a smyček je odsazená. Chcete-li tisknout zprávy z HereDoc bez odsazení, přidejte za operátor přesměrování pomlčku.
- Koncový oddělovač nemůže mít před sebou mezery ani odsazení.
Vyzkoušejte následující příklad kódu, abyste viděli, jak použít HereDoc uvnitř příkazu if:
#!/bin/bash
if true;
then
cat <<- "END"
Hello
World
END
fi
Pomlčka zajišťuje, že se odsazení při spuštění programu nezobrazí. Koncový oddělovač není odsazen a přidání mezer způsobí chybu.
Víceřádkové komentáře
HereDoc s příkazem null (:
) vytváří efekt blokových komentářů ve skriptech Bash.
Například:
#!/bin/bash
: << 'END'
This is a comment
END
Použití notace HereDoc jako komentář bloku je netradiční. Obecně platí, že Bash nepodporuje blokové komentáře.
Escape Characters
Chcete-li se vyhnout interpretaci znaků, přidejte zpětné lomítko (\
) před znakem:
cat << EOF
\$100
EOF
Alternativně se zcela vyhněte interpretaci znaků escapováním oddělovače:
cat << \EOF
$100
EOF
Použití uvozovek na oddělovač je v tomto případě ekvivalentní.
Funkce
Přidejte parametry do funkce předáním informací prostřednictvím HereDoc. Vytvořte například funkci pro čtení řádků a přidávání informací prostřednictvím HereDoc:
#!/bin/bash
readLines(){
read greeting
read name
}
readLines << EOF
Hello
$USER
EOF
echo $greeting
echo $name
Funkce ukládá informace poskytnuté HereDoc do proměnných.
Spusťte skript pro tisk hodnot proměnných do terminálu.
HereDoc a SSH
HereDoc je vhodný pro provádění více příkazů na vzdáleném počítači. Chcete-li spustit více příkazů, předejte HereDoc připojení SSH.
Například:
ssh [email protected] << EOF
echo "Local user: $USER"
echo "Remote user: \$USER"
EOF
Příkaz vytiskne místní a vzdálené uživatele do konzole.
HereDoc a SFTP
SFTP pomáhá bezpečně přenášet data prostřednictvím protokolu SSH. Přepošlete HereDoc pro automatické spuštění více příkazů SFTP:
sftp [email protected] << EOF
put test.sh
EOF
Kód nahraje ukázkový soubor na vzdálený počítač.