Bash
Hier documenten en hier strings
Zoeken…
Inspringen hier documenten
U kunt de tekst in deze documenten laten inspringen met tabbladen, u moet de operator <<-
omleiding gebruiken in plaats van <<
:
$ cat <<- EOF
This is some content indented with tabs `\t`.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
EOF
This is some content indented with tabs _\t_.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
Een praktisch gebruik hiervan (zoals vermeld in man bash
) is bijvoorbeeld in shellscripts:
if cond; then
cat <<- EOF
hello
there
EOF
fi
Het is gebruikelijk om de regels in codeblokken te laten inspringen zoals in deze if
instructie, voor een betere leesbaarheid. Zonder de syntaxis van de operator <<-
zouden we de bovenstaande code als volgt moeten schrijven:
if cond; then
cat << EOF
hello
there
EOF
fi
Dat is heel onaangenaam om te lezen, en het wordt veel erger in een complexer realistisch script.
Hier snaren
U kunt een opdracht invoeren met behulp van hier strings als volgt:
$ awk '{print $2}' <<< "hello world - how are you?"
world
$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she
Je kunt ook een while
lus voeden met een here-reeks:
$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello
Limietreeksen
Een heredoc gebruikt de limitstring om te bepalen wanneer de invoer moet worden gestopt. De terminating limitstring moet
- Aan het begin van een regel.
- Wees de enige tekst op de regel Opmerking: als u
<<-
de limietstring worden voorafgegaan door tabs\t
Correct:
cat <<limitstring
line 1
line 2
limitstring
Dit levert het volgende op:
line 1 line 2
Onjuist gebruik:
cat <<limitstring
line 1
line 2
limitstring
Omdat limitstring
op de laatste regel niet precies aan het begin van de regel staat, blijft de shell wachten op verdere invoer, totdat hij een regel ziet die begint met limitstring
en verder niets bevat. Alleen dan stopt het met wachten op invoer en gaat het door met het hier-document doorgeven aan het cat
commando.
Merk op dat wanneer u de eerste limietring voorafgaat met een koppelteken, alle tabbladen aan het begin van de regel worden verwijderd vóór het parseren, zodat de gegevens en de limietreeks kunnen worden ingesprongen met tabbladen (voor het gemak van het lezen in shellscripts).
cat <<-limitstring
line 1 has a tab each before the words line and has
line 2 has two leading tabs
limitstring
zal produceren
line 1 has a tab each before the words line and has line 2 has two leading tabs
met de voorste tabbladen (maar niet de interne tabbladen) verwijderd.
Maak een bestand aan
Een klassiek gebruik van deze documenten is om een bestand te maken door de inhoud ervan te typen:
cat > fruits.txt << EOF
apple
orange
lemon
EOF
Het hier-document is de lijn tussen de << EOF
en EOF
.
Dit hier-document wordt de invoer van het cat
commando. Het cat
commando voert eenvoudig zijn invoer uit en met behulp van de uitvoeromleidingsoperator >
verwijzen we door naar een bestand fruits.txt
.
Daarom bevat het bestand fruits.txt
de volgende regels:
apple
orange
lemon
De gebruikelijke regels voor uitvoeromleiding zijn van toepassing: als fruits.txt
niet eerder bestond, wordt het gemaakt. Als het eerder bestond, wordt het afgekapt.
Voer opdracht uit met hier document
ssh -p 21 [email protected] <<EOF
echo 'printing pwd'
echo "\$(pwd)"
ls -a
find '*.txt'
EOF
$
is ontsnapt omdat we niet willen dat het wordt uitgebreid door de huidige shell, dwz dat $(pwd)
moet worden uitgevoerd op de externe shell.
Een andere manier:
ssh -p 21 [email protected] <<'EOF'
echo 'printing pwd'
echo "$(pwd)"
ls -a
find '*.txt'
EOF
Opmerking : de afsluitende EOF moet aan het begin van de regel staan (geen witruimte eerder). Als inspringen vereist is, kunnen tabbladen worden gebruikt als u uw heredoc start met <<-
. Zie het inspringen hier documenten en Limit Strings voorbeelden voor meer informatie.
Voer verschillende opdrachten uit met sudo
sudo -s <<EOF
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "\$a"
EOF
-
$a
moet worden ontsnapt om te voorkomen dat het wordt uitgebreid door de huidige shell
Of
sudo -s <<'EOF'
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "$a"
EOF