next up previous contents
Nästa: 4. Fönstersystemet X Upp: 3. Kommandotolken Förra: 3.3 In- och utdata

   
3.4 Beskydd

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
$


 
Tabell: Teckenuppsättningen ISO-8859-1.
 
  0 1 2 3 4 5 6 7
04x
 {\isofont\symbol{'40}}  
 32  
 {\isofont\symbol{'41}}  
 33  
 {\isofont\symbol{'42}}  
 34  
 {\isofont\symbol{'43}}  
 35  
 {\isofont\symbol{'44}}  
 36  
 {\isofont\symbol{'45}}  
 37  
 {\isofont\symbol{'46}}  
 38  
 {\isofont\symbol{'47}}  
 39  
05x
 {\isofont\symbol{'50}}  
 40  
 {\isofont\symbol{'51}}  
 41  
 {\isofont\symbol{'52}}  
 42  
 {\isofont\symbol{'53}}  
 43  
 {\isofont\symbol{'54}}  
 44  
 {\isofont\symbol{'55}}  
 45  
 {\isofont\symbol{'56}}  
 46  
 {\isofont\symbol{'57}}  
 47  
06x
 {\isofont\symbol{'60}}  
 48  
 {\isofont\symbol{'61}}  
 49  
 {\isofont\symbol{'62}}  
 50  
 {\isofont\symbol{'63}}  
 51  
 {\isofont\symbol{'64}}  
 52  
 {\isofont\symbol{'65}}  
 53  
 {\isofont\symbol{'66}}  
 54  
 {\isofont\symbol{'67}}  
 55  
07x
 {\isofont\symbol{'70}}  
 56  
 {\isofont\symbol{'71}}  
 57  
 {\isofont\symbol{'72}}  
 58  
 {\isofont\symbol{'73}}  
 59  
 {\isofont\symbol{'74}}  
 60  
 {\isofont\symbol{'75}}  
 61  
 {\isofont\symbol{'76}}  
 62  
 {\isofont\symbol{'77}}  
 63  
10x
 {\isofont\symbol{'100}}  
 64  
 {\isofont\symbol{'101}}  
 65  
 {\isofont\symbol{'102}}  
 66  
 {\isofont\symbol{'103}}  
 67  
 {\isofont\symbol{'104}}  
 68  
 {\isofont\symbol{'105}}  
 69  
 {\isofont\symbol{'106}}  
 70  
 {\isofont\symbol{'107}}  
 71  
11x
 {\isofont\symbol{'110}}  
 72  
 {\isofont\symbol{'111}}  
 73  
 {\isofont\symbol{'112}}  
 74  
 {\isofont\symbol{'113}}  
 75  
 {\isofont\symbol{'114}}  
 76  
 {\isofont\symbol{'115}}  
 77  
 {\isofont\symbol{'116}}  
 78  
 {\isofont\symbol{'117}}  
 79  
12x
 {\isofont\symbol{'120}}  
 80  
 {\isofont\symbol{'121}}  
 81  
 {\isofont\symbol{'122}}  
 82  
 {\isofont\symbol{'123}}  
 83  
 {\isofont\symbol{'124}}  
 84  
 {\isofont\symbol{'125}}  
 85  
 {\isofont\symbol{'126}}  
 86  
 {\isofont\symbol{'127}}  
 87  
13x
 {\isofont\symbol{'130}}  
 88  
 {\isofont\symbol{'131}}  
 89  
 {\isofont\symbol{'132}}  
 90  
 {\isofont\symbol{'133}}  
 91  
 {\isofont\symbol{'134}}  
 92  
 {\isofont\symbol{'135}}  
 93  
 {\isofont\symbol{'136}}  
 94  
 {\isofont\symbol{'137}}  
 95  
14x
 {\isofont\symbol{'140}}  
 96  
 {\isofont\symbol{'141}}  
 97  
 {\isofont\symbol{'142}}  
 98  
 {\isofont\symbol{'143}}  
 99  
 {\isofont\symbol{'144}}  
 100  
 {\isofont\symbol{'145}}  
 101  
 {\isofont\symbol{'146}}  
 102  
 {\isofont\symbol{'147}}  
 103  
15x
 {\isofont\symbol{'150}}  
 104  
 {\isofont\symbol{'151}}  
 105  
 {\isofont\symbol{'152}}  
 106  
 {\isofont\symbol{'153}}  
 107  
 {\isofont\symbol{'154}}  
 108  
 {\isofont\symbol{'155}}  
 109  
 {\isofont\symbol{'156}}  
 110  
 {\isofont\symbol{'157}}  
 111  
16x
 {\isofont\symbol{'160}}  
 112  
 {\isofont\symbol{'161}}  
 113  
 {\isofont\symbol{'162}}  
 114  
 {\isofont\symbol{'163}}  
 115  
 {\isofont\symbol{'164}}  
 116  
 {\isofont\symbol{'165}}  
 117  
 {\isofont\symbol{'166}}  
 118  
 {\isofont\symbol{'167}}  
 119  
17x
 {\isofont\symbol{'170}}  
 120  
 {\isofont\symbol{'171}}  
 121  
 {\isofont\symbol{'172}}  
 122  
 {\isofont\symbol{'173}}  
 123  
 {\isofont\symbol{'174}}  
 124  
 {\isofont\symbol{'175}}  
 125  
 {\isofont\symbol{'176}}  
 126  
 
  0 1 2 3 4 5 6 7
24x
   
 160  
 {\isofont\symbol{'241}}  
 161  
 {\isofont\symbol{'242}}  
 162  
 {\isofont\symbol{'243}}  
 163  
 {\isofont\symbol{'244}}  
 164  
 {\isofont\symbol{'245}}  
 165  
 {\isofont\symbol{'246}}  
 166  
 {\isofont\symbol{'247}}  
 167  
25x
 {\isofont\symbol{'250}}  
 168  
 {\isofont\symbol{'251}}  
 169  
 {\isofont\symbol{'252}}  
 170  
 {\isofont\symbol{'253}}  
 171  
 {\isofont\symbol{'254}}  
 172  
 {\isofont\symbol{'255}}  
 173  
 {\isofont\symbol{'256}}  
 174  
 {\isofont\symbol{'257}}  
 175  
26x
 {\isofont\symbol{'260}}  
 176  
 {\isofont\symbol{'261}}  
 177  
 {\isofont\symbol{'262}}  
 178  
 {\isofont\symbol{'263}}  
 179  
 {\isofont\symbol{'264}}  
 180  
 {\isofont\symbol{'265}}  
 181  
 {\isofont\symbol{'266}}  
 182  
 {\isofont\symbol{'267}}  
 183  
27x
 {\isofont\symbol{'270}}  
 184  
 {\isofont\symbol{'271}}  
 185  
 {\isofont\symbol{'272}}  
 186  
 {\isofont\symbol{'273}}  
 187  
 {\isofont\symbol{'274}}  
 188  
 {\isofont\symbol{'275}}  
 189  
 {\isofont\symbol{'276}}  
 190  
 {\isofont\symbol{'277}}  
 191  
30x
 {\isofont\symbol{'300}}  
 192  
 {\isofont\symbol{'301}}  
 193  
 {\isofont\symbol{'302}}  
 194  
 {\isofont\symbol{'303}}  
 195  
 {\isofont\symbol{'304}}  
 196  
 {\isofont\symbol{'305}}  
 197  
 {\isofont\symbol{'306}}  
 198  
 {\isofont\symbol{'307}}  
 199  
31x
 {\isofont\symbol{'310}}  
 200  
 {\isofont\symbol{'311}}  
 201  
 {\isofont\symbol{'312}}  
 202  
 {\isofont\symbol{'313}}  
 203  
 {\isofont\symbol{'314}}  
 204  
 {\isofont\symbol{'315}}  
 205  
 {\isofont\symbol{'316}}  
 206  
 {\isofont\symbol{'317}}  
 207  
32x
 {\isofont\symbol{'320}}  
 208  
 {\isofont\symbol{'321}}  
 209  
 {\isofont\symbol{'322}}  
 210  
 {\isofont\symbol{'323}}  
 211  
 {\isofont\symbol{'324}}  
 212  
 {\isofont\symbol{'325}}  
 213  
 {\isofont\symbol{'326}}  
 214  
 {\isofont\symbol{'327}}  
 215  
33x
 {\isofont\symbol{'330}}  
 216  
 {\isofont\symbol{'331}}  
 217  
 {\isofont\symbol{'332}}  
 218  
 {\isofont\symbol{'333}}  
 219  
 {\isofont\symbol{'334}}  
 220  
 {\isofont\symbol{'335}}  
 221  
 {\isofont\symbol{'336}}  
 222  
 {\isofont\symbol{'337}}  
 223  
34x
 {\isofont\symbol{'340}}  
 224  
 {\isofont\symbol{'341}}  
 225  
 {\isofont\symbol{'342}}  
 226  
 {\isofont\symbol{'343}}  
 227  
 {\isofont\symbol{'344}}  
 228  
 {\isofont\symbol{'345}}  
 229  
 {\isofont\symbol{'346}}  
 230  
 {\isofont\symbol{'347}}  
 231  
35x
 {\isofont\symbol{'350}}  
 232  
 {\isofont\symbol{'351}}  
 233  
 {\isofont\symbol{'352}}  
 234  
 {\isofont\symbol{'353}}  
 235  
 {\isofont\symbol{'354}}  
 236  
 {\isofont\symbol{'355}}  
 237  
 {\isofont\symbol{'356}}  
 238  
 {\isofont\symbol{'357}}  
 239  
36x
 {\isofont\symbol{'360}}  
 240  
 {\isofont\symbol{'361}}  
 241  
 {\isofont\symbol{'362}}  
 242  
 {\isofont\symbol{'363}}  
 243  
 {\isofont\symbol{'364}}  
 244  
 {\isofont\symbol{'365}}  
 245  
 {\isofont\symbol{'366}}  
 246  
 {\isofont\symbol{'367}}  
 247  
37x
 {\isofont\symbol{'370}}  
 248  
 {\isofont\symbol{'371}}  
 249  
 {\isofont\symbol{'372}}  
 250  
 {\isofont\symbol{'373}}  
 251  
 {\isofont\symbol{'374}}  
 252  
 {\isofont\symbol{'375}}  
 253  
 {\isofont\symbol{'376}}  
 254  
 {\isofont\symbol{'377}}  
 255  


 
Tabell 3.2: Hur specialtecken skrivs.
 
\a alarmsignal
\b $\longleftarrow$
\e Esc
\f sidframmatningstecken
\n nyrad-tecken
\r vagnretur
\t tabulatorsteg
\v vertikalt tabulatorsteg
\\ bakvänt snedstreck
\ nnn tecken från tabell 3.1

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


next up previous contents
Nästa: 4. Fönstersystemet X Upp: 3. Kommandotolken Förra: 3.3 In- och utdata
Goran Andersson
1999-03-08