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

2.05b

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow