next up previous contents
Nästa: 6.2 De första programmen Upp: 6. Skalet Bash Förra: 6. Skalet Bash

  
6.1 Variabler

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.

  
Figur 6.1: Bash skriver om ett kommando.
\begin{figure}
\begin{center}
\psframebox[framesep=1.1]{
\begin{psmatrix}
\p...
...ows=->]{1,1}{2,1}\tlput{Omskrivning}
\end{psmatrix} }
\end{center}\end{figure}

Jämför med figur 3.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.

 
Tabell: Specialtecken som kan användas i prompten.
 
Tecken Skrivs om till...
\h Datorns namn (fram till första punkten)
\H Datorns namn
\u Det egna användarnamnet
\w Sökvägen till den nuvarande katalogen
\W Namnet på den nuvarande katalogen
\$ # om man är root, annars $.
\t Nuvarande klockslag
\T Klockslag (12-timmarsformat)
\@ Klockslag (am/pm-format)
\d Nuvarande datum
\s Skalets kommandonamn
\v Skalets versionsnummer
\V Versionsnumret, mer detaljerat
\a Alarmsignal
\e Esc
\n Nyrad-tecken
\\ Bakvänt snedstreck
\ nnn Tecken ur tabell 3.1
\# Kommandonummer
\! Kommandonummer bland bevarade kommandon

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.


next up previous contents
Nästa: 6.2 De första programmen Upp: 6. Skalet Bash Förra: 6. Skalet Bash
Goran Andersson
1999-03-08