Ett antal tecken, bland andra
*, har en speciell mening för skalet.
Ibland kan detta ställa till problem.
Om jag exempelvis vill skriva ut texten
''Det mest använda jokertecknet är *'',
hur gör jag då?
Så här kan jag inte göra:$ echo Det mest använda jokertecknet är *
Det mest använda jokertecknet är bellman dikter lenngren
$Problemet är att skalet griper in och ändrar i det
kommando jag gav. Hur ska jag göra för att skydda mitt kommando
från skalets inblandning? Svaret är att jag ska ge mitt
kommando beskydd.
Med hjälp av beskydd tar man bort den speciella betydelse
vissa tecken har för skalet, och kan därigenom få dessa tecken
att ingå i argument till kommandon.
Det enklaste sättet att ge beskydd är att använda tecknet \,
det bakvända snedstrecket.
Det skyddar det tecken som följer efter det från att tolkas av skalet.
Så problemet med utskriften ovan kan lösas så här:$ echo Det mest använda jokertecknet är \*
Det mest använda jokertecknet är *
$Skalet skriver om kommandot ovan genom att ta bort beskyddet,
men det tecken som var skyddat skrivs inte om på något sätt.
Att skriva ut ett uttryck som 2 * 3 > 5 är lika enkelt:$ echo 2 \* 3 \> 5
2 * 3 > 5
$Så här skulle det gå ifall jag inte hade använt beskydd:$ echo 2 * 3 > 5
$ ls
5 bellman dikter/ lenngren
$ cat 5
2 bellman dikter lenngren 3
$ rm 5
$Skalet tolkade * som ett jokertecken och
riktade utdatan till en fil med namnet 5.
Vi har redan sett att det bakvända snedstrecket
har en speciell betydelse om det skrivs sist i en
kommandorad; det tolkas som att kommandot ska fortsätta
på nästa rad. $ echo Gub\
> ben Noach
Gubben Noach
$I princip plockar skalet bort
det bakvända snedstrecket och nyrad-tecknet från kommandot.
Men detta är enda undantaget - alla tecken utom
nyrad-tecknet skyddas från skalets inblandning om
de föregås av tecknet \.
Det bakvända snedstrecket kan till och med skydda sig självt:$ echo Beskydd ges av tecknet \\
Beskydd ges av tecknet \
$
Man kan skydda en hel textsträng
genom att omge den med apostrofer. Därigenom slipper man sätta
ett bakvänt snedstreck framför varje ''farligt'' tecken i strängen.
Skalet skriver om kommandot genom att ta bort apostroferna,
men det som stod inom apostroferna lämnas sedan intakt.$ echo 'Tecknen * och \ skyddas så här.'
Tecknen * och \ skyddas så här.
$ echo '2 * 3 > 5'
2 * 3 > 5
$
Med ett blanktecken menas ett mellanslag eller tabulatorsteg.
Om skalet påträffar en följd av nyrad-tecken eller blanktecken, så
plockas dessa bort från kommandot. Den enda effekten de har är att
de separerar argument.$ cp bellman Epistel21
$ ls
Epistel21 bellman dikter/ lenngren
$ rm Epistel21
$Att jag skrev flera mellanslag mellan bellman och
Epistel21 spelade ingen roll, kommandot exekverades
på samma sätt som om det bara hade funnits ett enda
mellanslag. Skalet noterade
att det första argumentet var bellman och det andra
var Epistel21, men sedan togs mellanslagen bort.
Därefter skickades argumenten till programmet cp,
som inte fick veta att det från början fanns flera mellanslag
mellan dem. På samma sätt går det här:$ echo bellman Epistel21
bellman Epistel21
$Skalet åt upp mellanslagen efter att argumenten hade separerats.
Sedan skickades de båda argumenten till echo,
som skrev ut dem med ett enda mellanslag som separator.
Men hur ska man då göra om man vill att ett argument
ska innehålla blanktecken eller nyrad-tecken?
Svaret på denna fråga är naturligtvis att man ska
ge dessa tecken beskydd gentemot skalet.$ echo 'bellman Epistel21'
bellman Epistel21
$ echo 'Apostrofer kan
> skydda nyrad-tecken.'
Apostrofer kan
skydda nyrad-tecken.
$
Genom att använda beskydd kan man få filnamn som innehåller
specialtecken, inklusive mellanslag och nyrad-tecken.
Detta rekommenderas inte, för ju konstigare tecken ett
filnamn innehåller, desto svårare blir det att hantera filnamnet.
Antag att vi ändå, mot bättre vetande, vill kopiera filen
bellman och ge kopian namnet Epistel 21.
Här är vårt första försök:$ cp bellman Epistel 21
cp: kopiering av flera filer, men sista argumentet (21) är inte en katalog
Försök med "cp --help" för mer information.
$Det gick inte så bra. Då skalet tolkar kommandot vi gav, tror det att
bellman, Epistel och 21 är tre separata argument.
Vi måste skydda mellanslaget mellan Epistel och 21
från skalet:$ cp bellman 'Epistel 21'
$ ls
Epistel 21 bellman dikter/ lenngren
$ ls -l
total 4
-rw------- 1 göran göran 372 feb 3 15:58 Epistel 21
-rw------- 1 göran göran 372 feb 1 16:48 bellman
drwxrwxr-x 2 göran göran 1024 feb 1 17:12 dikter/
-rw-rw-r-- 1 göran göran 649 feb 1 15:53 lenngren
$Den här gången gick det bättre. Tack vare att blanktecknet var
skyddat, delades inte Epistel 21 upp i två argument,
utan det sågs som ett enda. Vi måste skydda blanktecknet
varje gång vi hänvisar till filen Epistel 21:$ wc Epistel 21
wc: Epistel: Filen eller katalogen finns inte
wc: 21: Filen eller katalogen finns inte
0 0 0 total
$ wc Epistel\ 21
12 71 372 Epistel 21
$Vid kommandot wc Epistel 21 tolkades Epistel och 21
återigen som separata argument, och wc trodde då att
det rörde sig om två olika filnamn. I det följande kommandot,
där mellanslaget var skyddat (denna gång av ett bakvänt snedstreck),
sågs däremot Epistel 21 som ett enda filnamn.
När jag nedan raderar filen, demonstrerar jag ett tredje sätt
att skydda blanktecknet:$ rm Epistel' '21
$ ls
bellman dikter/ lenngren
$Man behöver alltså inte skydda hela texten med apostrofer,
bara de ''farliga'' tecknen.
Apostrofer skyddar alla tänkbara tecken, med ett undantag:
de kan inte skydda sig själva.
Man kan inte ha en apostrof mellan två andra, för då skulle ju den
första och den mellersta apostrofen tolkas som ett par.
Däremot kan apostrofer skyddas av
det bakvända snedstrecket:$ echo tag dig se\'n dito en
tag dig se'n dito en
$
Det beskydd som apostrofer
ger förändras ifall man sätter ett dollartecken före
den första apostrofen.
Uttryck som $'text' är alltså speciella.
I sådana uttryck fungerar
det bakvända snedstrecket som ett kommando.
Det hela går ut på att man ska kunna få
vilka tecken som helst att ingå i argument.
Till exempel skrivs \n om till ett
nyrad-tecken och \t till ett tabulatorsteg.$ echo $'den skönsta nymf, som åt dig ler,\n\tinunder armen tag.'
den skönsta nymf, som åt dig ler,
inunder armen tag.
$I tabell 3.2 anges vilka specialtecken som
kan skrivas så här.
På liknande sätt kan skriva vilket tecken som helst
genom att ange dess oktalkod.
I tabell 3.1 visas oktalkoden för samtliga skrivbara
tecken i den teckenuppsättning, ISO-8859-1, som används i
Sverige. Oktalkoden består av tre siffror. De två första
står i kolumnen till vänster i tabellen medan
den tredje, som ska ersätta symbolen x, står i den översta
raden.
(Den siffra som står under varje tecken kallas för dess
decimalkod. Vi kommer inte att ha användning
för decimalkoderna här.)
Till exempel har tecknet ë oktalkod 353, och
namnet ''Citroën'' kan skrivas så här:$ echo $'Citro\353n'
Citroën
$
|
Slutligen vill vi nämna att det finns ett tredje och
sista sätt att beskydda tecken och teckensträngar, nämligen att
omge dem med citationstecken.
Citationstecken fungerar ungefär som apostrofer, men de
ger inte ett lika säkert skydd.
Varken det bakvända snedstrecket,
dollartecknet,
den bakvända apostrofen ` eller citationstecknet självt
skyddas av citationstecken.
Det finns två skäl till att man ibland använder
citationstecken som skydd. Det ena skälet är
att man därigenom kan skydda
en textsträng som innehåller apostrofer.
Det andra, som vi ska återkomma till i
kapitel 6,
är att man med hjälp av citationstecken
kan få skalet att göra vissa, och undvika övriga,
av de vanliga omskrivningarna.$ echo "tag dig se'n dito en"
tag dig se'n dito en
$Om ett citationstecken ska skrivas ut, så måste det skyddas -
antingen av ett bakvänt snedstreck eller av apostrofer:$ echo 'Säg "hej" till farbror Göran!'
Säg "hej" till farbror Göran!
$Vill man ha ett dollartecken, ett bakvänt snedstreck
eller ett nytt citationstecken mellan två citationstecken, så ska
man ett bakvänt snedstreck som skydd.$ mening="En \"meningslös\" mening med \\ och \$"
$ echo $mening
En "meningslös" mening med \ och $
$