Bash
Här dokument och här strängar
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
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