Man kan använda variabler i Bash. En variabel är ett namn som har getts ett visst värde. Variabelnamnet får bara innehålla bokstäverna a till z samt siffror och understrykningstecken, och det får inte börja med en siffra. Värdet är helt enkelt en följd av tecken; det finns inga datatyper som tex heltal eller flyttal.
Kommandot namn=värde
ger variabeln namn värdet värde.
(Det får inte finnas något mellanrum före
eller efter likhetstecknet.)
Om texten $namn
sedan förekommer
i ett kommando, så skriver Bash om kommandot genom att
byta ut $namn mot värde.
För att tilldela variabeln
ADRESS värdet goran_a@sslug.dk
ska man alltså ge kommandot$ ADRESS=goran_a@sslug.dk
$ Hädanefter vet Bash att ADRESS
har värdet goran_a@sslug.dk.
Låt oss prova att använda variabeln!$ echo $ADRESS
goran_a@sslug.dk
$Kommandot echo $ADRESS skrevs här om till
echo goran_a@sslug.dk innan det
exekverades, se figur 6.1.
Följande kommando
skickar
innehållet i filen bellman som datorpost till
adressen goran_a@sslug.dk:$ mail $ADRESS < bellman
$
Man måste komma ihåg dollartecknet
för att Bash ska sätta in variabelns värde:$ echo ADRESS
ADRESS
$Variabler kan användas inom citationstecken:$ echo "Skicka svaret till Göran <$ADRESS>"
Skicka svaret till Göran <goran_a@sslug.dk>
$Detta visar att citationstecken inte skyddar mot omskrivning
av $namn.
Om värde innehåller blank- eller nyrad-tecken,
så måste man beskydda det så att Bash
ser det som ett enda ord.$ NAMN=Göran Andersson
bash: Andersson: command not found
$ NAMN='Göran Andersson'
$ echo $NAMN
Göran Andersson
$I nästa exempel låter vi variablens värde vara
det kommando vi ska ge:$ KOMMANDO=date
$ $KOMMANDO
tis feb 17 11:05:48 CET 1998
$Man kan också lagra flaggor i en variabel:$ FLAGGOR=-l
$ echo Variabeln FLAGGOR har värdet $FLAGGOR
Variabeln FLAGGOR har värdet -l
$ ls $FLAGGOR
total 3
-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
$Härnäst ska vi ge variabeln
NYA_FLAGGOR samma värde som
FLAGGOR men med tillägg av -t.
(Om man ger ls flaggan -t,
så sorteras filerna efter senaste ändringsdatum;
de nyaste filerna visas först.)$ NYA_FLAGGOR=$FLAGGOR -t
bash: -t: command not found
$Det blev fel eftersom vi glömde skydda blanktecknet
före -t. Vi gör ett nytt försök,
och utnyttjar då att citationstecken skyddar blanktecken men
inte dollartecken:$ NYA_FLAGGOR="$FLAGGOR -t"
$ echo $NYA_FLAGGOR
-l -t
$ ls $NYA_FLAGGOR
total 3
drwxrwxr-x 2 göran göran 1024 feb 1 17:12 dikter/
-rw------- 1 göran göran 372 feb 1 16:48 bellman
-rw-rw-r-- 1 göran göran 649 feb 1 15:53 lenngren
$ Nu ska vi ändra värdet av variabeln FLAGGOR
genom att till dess nuvarande värde lägga tecknen rt.
(Flaggan -r uppmanar ls att lista filerna i omvänd ordning.)
Men det finns ett litet problem: vi kan inte skriva
FLAGGOR=$FLAGGORrt, för då skulle FLAGGORrt
tolkas som ett variabelnamn. Men Bash tillåter att man skriver
${namn} i stället för $namn,
så vi kan göra så här:$ FLAGGOR=${FLAGGOR}rt
$ echo $FLAGGOR
-lrt
$ KOMMANDO=ls
$ $KOMMANDO $FLAGGOR
total 3
-rw-rw-r-- 1 göran göran 649 feb 1 15:53 lenngren
-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/
$
Det finns ett antal variabler som är av en speciell betydelse
för Bash. En sådan
variabel är PS1, vars värde bestämmer hur
prompten ser ut.$ echo $PS1
\$
$ PS1='vad nu? '
vad nu? ls
bellman dikter/ lenngren
vad nu?I värdet av PS1 kan man ange ett antal specialtecken,
se tabell 6.1.
Bla skrivs \h om till datorns namn och
\u till det egna användarnamnet.vad nu? PS1='[\u@\h \w]\$ '
[göran@fafner ~]$ cd dikter
[göran@fafner ~/dikter]$ cd /usr/doc
[göran@fafner /usr/doc]$ cd
[göran@fafner ~]$ PS1='\$ '
$I prompten ovan står tecknet ~ för min hemkatalog.
|
Värdet av variabeln PS2 bestämmer utseendet av den sekundära prompten,
den prompt man får när ett kommando sträcker sig över mer än en rad.$ echo $PS2
>
$
En annan variabel som är viktig för Bash är PATH.
Den anger en lista av kataloger, separerade av kolon,
där Bash ska leta efter program som man anropar i sina instruktioner.$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
$Till exempel använder man programmet wc i instruktionen
wc bellman.
Programmet wc är inte inbyggt i Bash,
utan det finns i filen /usr/bin/wc
på min dator.
Bash kan hitta det tack vare att katalogen
/usr/bin är uppräknad i PATH.
Så här går det om vi tar bort /usr/bin från
värdet av PATH:$ PATH=/usr/local/bin:/usr/games
$ wc bellman
bash: wc: command not found
$Vi tvingas nu ange sökvägen till wc:$ /usr/bin/wc bellman
12 71 372 bellman
$Den nuvarande katalogen . finns för tillfället
inte i värdet av PATH.
Därför måste vi ange sökvägen till
programmet wc även om vi befinner oss
i den katalog som inhyser det:$ cd /usr/bin
$ wc /home/göran/bellman
bash: wc: command not found
$ ./wc /home/göran/bellman
12 71 372 /home/göran/bellman
$Vi bör tydligen lägga tillbaka de kataloger som togs bort ur PATH:$ PATH=/usr/bin:/bin:/usr/bin/X11:$PATH:.
$ echo $PATH
$ /usr/bin:/bin:/usr/bin/X11:/usr/local/bin:/usr/games:.
$ cd
$Katalogerna i PATH genomsöks i tur och ordning.
Om det finns två olika
program med samma namn, så exekveras därför det av de båda programmen
vars ''hemkatalog'' räknas upp först i PATH.
Ordningen av katalogerna i PATH har alltså
viss betydelse.