Sök…


Syntax

  • \ C (vilket som helst tecken förutom ny linje)
  • "alla bokstavliga utom enstaka citat"; 'detta:' \ '' är en enda offert '
  • Endast $ '\ \ och \' är speciella; \ n = newline etc. '
  • "$ variabel och annan text; \" \\\ $ \ `är special"

Nyheter och kontrolltecken

En ny linje kan inkluderas i en enkelsträng eller dubbelciterad sträng. Observera att backslash-newline inte resulterar i en ny linje, linjen bryts ignoreras.

newline1='
'
newline2="
"
newline3=$'\n'
empty=\

echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"

Inuti dollar-offert-strängar kan backslash-letter eller backslash-octal användas för att infoga kontrolltecken, som på många andra programmeringsspråk.

echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'

Dubbla citat för variabel och kommandosubstitution

Variabla substitutioner bör endast användas i dubbla citat.

calculation='2 * 3'
echo "$calculation"         # prints 2 * 3
echo $calculation           # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))"    # prints 6

Utanför dubbla citat tar $var värdet på var , delar det upp i en delavgränsad del och tolkar varje del som ett globalt (jokertecken) -mönster. Om du inte vill ha detta beteende, lägg alltid $var i dubbla citat: "$var" .

Detsamma gäller för kommandosubstitutioner: "$(mycommand)" är utgången från mycommand , $(mycommand) är resultatet av split + glob på utgången.

echo "$var"             # good
echo "$(mycommand)"     # good 
another=$var            # also works, assignment is implicitly double-quoted
make -D THING=$var      # BAD! This is not a bash assignment.
make -D THING="$var"    # good
make -D "THING=$var"    # also good

Kommandoersättningar får sina egna citatförhållanden. Att skriva godtyckligt kapslade substitutioner är enkelt eftersom tolkaren kommer att hålla reda på häckningsdjupet istället för att girigt söka efter det första " tecknet. StackOverflow syntax-markören tolkar dock detta fel. Till exempel:

echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”

Variabla argument till en kommandosubstitution bör också citeras i utvidgningarna:

echo "$(mycommand "$arg1" "$arg2")"

Citera bokstavlig text

Alla exempel i det här stycket skriver ut raden

!"#$&'()*;<=>?  @[\]^`{|}~

Ett bakslag raderar nästa tecken, dvs. nästa tecken tolkas bokstavligen. Det ena undantaget är en ny linje: backslash-newline expanderar till den tomma strängen.

echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~

All text mellan enkla citationstecken (framåt citat ' , även känd som apostrof) skrivs bokstavligt. Till och med backslash står för sig själv, och det är omöjligt att ta med en enda offert; istället kan du stoppa den bokstavliga strängen, inkludera en bokstavlig enstaka offert med ett bakslag och starta den bokstavliga strängen igen. Således möjliggör den 4-teckeniga sekvensen '\'' att inkludera ett enda citat i en bokstavlig sträng.

echo '!"#$&'\''()*;<=>?  @[\]^`{|}~'
#          ^^^^

Enkel-offert för $'…' startar en strängbokstavlig $'…' som många andra programmeringsspråk, där backslash citerar nästa tecken.

echo $'!"#$&\'()*;<=>?  @[\\]^`{|}~'
#           ^^            ^^

Dubbla citat " avgränsar halvlitterära strängar där bara karaktärerna " \ $ och ` behåller sin speciella betydelse. Dessa tecken behöver en backslash före dem (notera att om backslash följs av någon annan karaktär, är backslash kvar). Dubbla citat är mest användbart när du inkluderar en variabel eller en kommandosubstitution.

echo "!\"#\$&'()*;<=>?  @[\\]^\`{|}~"
#      ^^                 ^^  ^^
echo "!\"#\$&'()*;<=>?  @[\]^\`{|}~"
#      ^^                 ^  ^^      \[ prints \[

Interaktivt, se upp för det ! utlöser historiautvidgning i dubbla citat: "!oops" letar efter ett äldre kommando som innehåller oops ; "\!oops" gör inte historiautvidgning utan behåller motsatsen. Detta händer inte i skript.

Skillnaden mellan dubbla offertar och enstaka offert

Dubbel offert Enkel offert
Tillåter variabel expansion Förhindrar variabel expansion
Tillåter historiautvidgning om den är aktiverad Förhindrar historiautvidgning
Tillåter ersättning av kommandon Förhindrar utbyte av kommandon
* och @ kan ha speciell betydelse * och @ är alltid bokstäver
Kan innehålla både enstaka offert eller dubbla offert Enstaka offert är inte tillåtet i en enda offert
$ , ` , " , \ kan undgås med \ att förhindra deras speciella betydelse Alla är bokstavliga

Egenskaper som är gemensamma för båda:

  • Förhindrar klumpning
  • Förhindrar uppdelning av ord

Exempel:

$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow