Zoeken…
Syntaxis
- \ C (een willekeurig teken behalve de nieuwe regel)
- 'alle letterlijke behalve enkele aanhalingstekens'; 'this:' \ '' is een enkele quote '
- $ 'alleen \\ en \' zijn speciaal; \ n = newline etc. '
- "$ variabele en andere tekst; \" \\\ $ \ `zijn speciaal"
Nieuwe regels en controlekarakters
Een nieuwe regel kan worden opgenomen in een string met enkele of dubbele aanhalingstekens. Merk op dat backslash-newline niet resulteert in een nieuwe regel, het regeleinde wordt genegeerd.
newline1='
'
newline2="
"
newline3=$'\n'
empty=\
echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"
Binnen tekenreeksen met dollar-aanhalingstekens kunnen backslash-letter of backslash-octaal worden gebruikt om controletekens in te voegen, zoals in veel andere programmeertalen.
echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'
Dubbele aanhalingstekens voor variabele en opdrachtvervanging
Variabele substituties mogen alleen binnen dubbele aanhalingstekens worden gebruikt.
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
Buiten dubbele aanhalingstekens neemt $var
de waarde van var
, splitst deze in witruimte-gescheiden delen en interpreteert elk deel als een glob (wildcard) patroon. Tenzij u dit gedrag wilt, plaatst u $var
altijd tussen dubbele aanhalingstekens: "$var"
.
Hetzelfde geldt voor opdrachtvervangingen: "$(mycommand)"
is de uitvoer van mycommand
, $(mycommand)
is het resultaat van split + glob op de uitvoer.
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
Opdrachtvervangingen krijgen hun eigen citaatcontexten. Willekeurig geneste substituties schrijven is eenvoudig omdat de parser de nestdiepte bijhoudt in plaats van gretig te zoeken naar het eerste "
karakter. De syntaxismarkeerstift StackOverflow ontleedt dit echter echter verkeerd. Bijvoorbeeld:
echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”
Variabele argumenten voor een opdrachtvervanging moeten ook binnen de uitbreidingen dubbel worden geciteerd:
echo "$(mycommand "$arg1" "$arg2")"
Letterlijke tekst citeren
Alle voorbeelden in deze paragraaf drukken de regel af
!"#$&'()*;<=>? @[\]^`{|}~
Een backslash citeert het volgende karakter, dat wil zeggen dat het volgende karakter letterlijk wordt geïnterpreteerd. De enige uitzondering is een nieuwe regel: backslash-newline wordt uitgebreid naar de lege tekenreeks.
echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~
Alle tekst tussen enkele aanhalingstekens (voorwaartse aanhalingstekens '
, ook wel apostrof genoemd) wordt letterlijk afgedrukt. Zelfs backslash staat voor zichzelf en het is onmogelijk om een enkele quote op te nemen; in plaats daarvan kunt u de letterlijke reeks stoppen, een letterlijk enkelvoudig citaat met een backslash opnemen en de letterlijke reeks opnieuw beginnen. Zo laat de reeks van 4 tekens '\''
effectief toe om een enkel citaat in een letterlijke string op te nemen.
echo '!"#$&'\''()*;<=>? @[\]^`{|}~'
# ^^^^
Dollar-single-quote begint een string letterlijk $'…'
zoals vele andere programmeertalen, waarbij backslash het volgende karakter citeert.
echo $'!"#$&\'()*;<=>? @[\\]^`{|}~'
# ^^ ^^
Dubbele aanhalingstekens "
begrenzen semi-letterlijke tekenreeksen waarbij alleen de tekens "
\
$
en `
hun speciale betekenis behouden. Deze karakters hebben een backslash nodig vóór hen (merk op dat als backslash wordt gevolgd door een ander karakter, de backslash blijft). Dubbele aanhalingstekens zijn meestal handig wanneer u een variabele of een opdrachtvervanging opneemt.
echo "!\"#\$&'()*;<=>? @[\\]^\`{|}~"
# ^^ ^^ ^^
echo "!\"#\$&'()*;<=>? @[\]^\`{|}~"
# ^^ ^ ^^ \[ prints \[
Interactief, pas op !
activeert geschiedenisuitbreiding binnen dubbele aanhalingstekens: "!oops"
zoekt naar een ouder commando met oops
; "\!oops"
doet geen geschiedenisuitbreiding maar houdt de backslash. Dit gebeurt niet in scripts.
Verschil tussen dubbele aanhalingstekens en enkele aanhalingstekens
Dubbele aanhalingstekens | Alleenstaande citaat |
---|---|
Staat variabele uitbreiding toe | Voorkomt variabele uitbreiding |
Staat uitbreiding van geschiedenis toe indien ingeschakeld | Voorkomt uitbreiding van de geschiedenis |
Staat opdrachtvervanging toe | Voorkomt opdrachtvervanging |
* en @ kunnen een speciale betekenis hebben | * en @ zijn altijd letterlijk |
Kan zowel enkele aanhalingstekens als dubbele aanhalingstekens bevatten | Enkele quote is niet toegestaan binnen enkele quote |
$ , ` , " , \ kan worden ontsnapt met \ om hun speciale betekenis te voorkomen | Ze zijn allemaal letterlijk |
Eigenschappen die beide gemeen hebben:
- Voorkomt bolling
- Voorkomt splitsing van woorden
Voorbeelden:
$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var