Android

Bash heredoc

What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179

What is a heredoc? Here Documents Explained | Linux Terminal 201 - HakTip 179

Inhoudsopgave:

Anonim

Wanneer u shell-scripts schrijft, bevindt u zich mogelijk in een situatie waarin u een meerregelig tekstblok of code moet doorgeven aan een interactieve opdracht, zoals tee , cat of sftp .

In Bash en andere shells zoals Zsh is een Here-document (Heredoc) een soort omleiding waarmee u meerdere invoerregels aan een opdracht kunt doorgeven.

De syntaxis van het schrijven van HereDoc heeft de volgende vorm:

<< 'DELIMITER' HERE-DOCUMENT DELIMITER

  • De eerste regel begint met een optioneel commando gevolgd door de speciale omleidingsoperator << en de afbakenings-ID.
    • Je kunt elke string gebruiken als afbakenings-ID, de meest gebruikte zijn EOF of END. Als de afbakenings-ID niet wordt vermeld, vervangt de shell alle variabelen, opdrachten en speciale tekens voordat de hier-documentregels aan de opdracht worden doorgegeven. minteken naar de omleidingsoperator <<- , zorgt ervoor dat alle voorlooptabtekens worden genegeerd. Hiermee kunt u inspringen gebruiken bij het schrijven van hier-documenten in shellscripts. Voorloopspaties zijn niet toegestaan, alleen tab.
    Het hier-documentblok kan tekenreeksen, variabelen, opdrachten en elk ander type invoer bevatten. De laatste regel eindigt met de afbakenende identificatie. Witruimte voor het scheidingsteken is niet toegestaan.

Basis Heredoc-voorbeelden

In deze sectie zullen we enkele basisvoorbeelden bekijken van het gebruik van heredoc.

Heredoc wordt meestal gebruikt in combinatie met het commando cat.

In het volgende voorbeeld geven we twee regels tekst door met een omgevingsvariabele en een opdracht aan cat met behulp van een here-document.

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

Zoals u kunt zien in de onderstaande uitvoer, worden zowel de variabele als de opdrachtuitvoer vervangen:

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

Laten we kijken wat er zal gebeuren als we het scheidingsteken tussen enkele of dubbele aanhalingstekens plaatsen.

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

U kunt opmerken dat wanneer het scheidingsteken wordt geciteerd, de parameter niet wordt uitgebreid en de opdracht wordt vervangen door de shell.

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

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

Line with a leading tab.

In plaats van de uitvoer op het scherm weer te geven, kunt u deze omleiden naar een bestand met de operatoren > , >> .

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

Als file.txt niet bestaat, wordt het gemaakt. Bij gebruik van > het bestand overschreven, terwijl >> de uitvoer aan het bestand toevoegt.

De heredoc-invoer kan ook worden doorgestuurd. In het volgende voorbeeld vervangt het commando sed alle instanties van het l teken door e :

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

Heeeo Wored

Om de piped-gegevens naar een bestand te schrijven:

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

Heredoc gebruiken met SSH

Heredoc gebruiken is een van de handigste en eenvoudigste manieren om meerdere opdrachten op een extern systeem uit te voeren via SSH.

Wanneer u een niet-gescheiden scheidingsteken gebruikt, moet u ervoor zorgen dat u aan alle variabelen, opdrachten en speciale tekens ontsnapt, anders worden ze lokaal geïnterpoleerd:

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

Misschien wilt u ook een op SSH-sleutel gebaseerde verificatie instellen en verbinding maken met uw Linux-servers zonder een wachtwoord in te voeren.

Conclusie

In deze handleiding heb je geleerd wat heredoc en hoe je het kunt gebruiken in je shellscripts.

bash-terminal