Sök…


Intryck här dokument

Du kan infoga texten inuti dokument med flikar, du måste använda <<- omdirigeringsoperatör istället för << :

$ 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.

Ett fall av praktisk användning av detta (som nämnts i man bash ) är i skalskript, till exempel:

if cond; then
    cat <<- EOF
    hello
    there
    EOF
fi

Det är vanligt att fördjupa raderna i kodblock som i detta if uttalande, för bättre läsbarhet. Utan <<- operatörssyntax, skulle vi tvinga skriva ovanstående kod som denna:

if cond; then
    cat << EOF
hello
there
EOF
fi

Det är väldigt obehagligt att läsa, och det blir mycket värre i ett mer komplex realistiskt manus.

Här strängar

2.05b

Du kan mata ett kommando med här strängar som detta:

$ awk '{print $2}' <<< "hello world - how are you?"
world

$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she

Du kan också mata en while slinga med en här sträng:

$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello

Begränsa strängar

En heredoc använder limsträngen för att bestämma när man ska sluta konsumera input. Avslutningsgränsen måste

  • Var i början av en linje.
  • Var den enda texten på raden Obs! Om du använder <<- kan limsträngen förinställas med flikar \t

Korrekt:

cat <<limitstring
line 1
line 2
limitstring

Detta kommer att matas ut:

line 1
line 2

Felaktig användning:

cat <<limitstring
line 1
line 2
 limitstring

Eftersom limitstring på den sista raden inte exakt är i början av linjen, kommer skalet att fortsätta att vänta på ytterligare inmatning, tills den ser en linje som börjar med limitstring och inte innehåller något annat. Först då kommer det att sluta vänta på inmatning och fortsätta att skicka här-dokumentet till cat .

Observera att när du prefixerar den inledande begränsningssträngen med bindestreck, tas alla flikar i början av raden bort innan du analyserar, så att data och begränsningssträngen kan indragas med flikar (för att underlätta läsning i skalskript).

cat <<-limitstring
        line 1    has a tab each before the words line and has
            line 2 has two leading tabs
        limitstring

kommer att producera

line 1    has a tab each before the words line and has
line 2 has two leading tabs

med de ledande flikarna (men inte de interna flikarna) bort.

Skapa en fil

En klassisk användning av här dokument är att skapa en fil genom att skriva in dess innehåll:

cat > fruits.txt << EOF
apple
orange
lemon
EOF

Här-dokumentet är raderna mellan << EOF och EOF .

Detta här dokument blir ingången till cat . cat matar ut sin inmatning, och med utgångsdirigeringsoperatören > omdirigerar vi till en fil fruits.txt .

Som ett resultat fruits.txt filen fruits.txt att innehålla raderna:

apple
orange
lemon

De vanliga reglerna för output omdirigering gäller: om fruits.txt inte fanns tidigare kommer det att skapas. Om det fanns tidigare kommer det att avkortas.

Kör kommando med här dokumentet

ssh -p 21 [email protected] <<EOF
  echo 'printing pwd'
  echo "\$(pwd)"
  ls -a
  find '*.txt'
EOF

$ undviks eftersom vi inte vill att det ska utökas med det nuvarande skalet, dvs $(pwd) ska köras på fjärrskalet.

En annan väg:

ssh -p 21 [email protected] <<'EOF'
  echo 'printing pwd'
  echo "$(pwd)"
  ls -a
  find '*.txt'
EOF    

Obs! Den avslutande EOF bör vara i början av raden (Inga blanksteg innan). Om indragning krävs kan flikar användas om du startar din heredoc med <<- . Se indrag här dokumenten och Limit strängar exempel för mer information.

Kör flera kommandon med sudo

sudo -s <<EOF
  a='var'
  echo 'Running serveral commands with sudo'
  mktemp -d
  echo "\$a"
EOF
  • $a måste undvikas för att förhindra att den expanderas av det nuvarande skalet

Eller

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow