next up previous contents
Nästa: 11.7 Aritmetik Upp: 11. Grundläggande Bashprogrammering Förra: 11.5 Att hantera argument

11.6 Strängoperatorer

Som bekant erhålls värdet av variabel då man skriver ${variabel}. Vi ska nu beskriva ett antal strängoperatorer som kan manipulera de värden som erhålls.

Uttrycket ${variabel:-sträng} skrivs om till värdet av variabel om det är definierat och inte tomt, annars till sträng. På detta sätt kan man ha ett värde i reserv när en variabel saknar värde.$ KAND=hej
$ echo ${KAND:-adjö}
hej
$ echo ${OKAND:-adjö}
adjö
$
Reservvärdet adjö användes vid det andra tillfället ovan eftersom variabeln OKAND är odefinierad. Operatorn :- förändrar inte variabelns ursprungliga värde:$ echo $OKAND,$KAND
,hej
$
Operatorn := fungerar som :- bortsett från att variabeln variabel sätts lika med sträng ifall den saknar värde.$ echo ${KAND:=adjö}
hej
$ echo ${OKAND:=adjö}
adjö
$ echo $OKAND,$KAND
adjö,hej
$

Uttrycket ${variabel:?sträng} skrivs om till värdet av variabel om det är definierat och inte tomt, annars skrivs sträng ut som ett felmeddelande (och programkörningen avbryts om detta inträffar i ett program).$ echo "Säg ${KAND:?Värde saknas} till Göran."
Säg hej till Göran.
$ OKAND=
$ echo "Säg ${OKAND:?Värde saknas} till Göran."
bash: OKAND: Värde saknas
$

Uttrycket ${variabel:+sträng} tas bort ifall variabel saknar värde, annars skrivs det om till sträng:$ echo "Värdet är ${KAND:+inte }tomt."
Värdet är inte tomt.
$ echo "Värdet är ${OKAND:+inte }tomt."
Värdet är tomt.
$

För var och en av operatorerna :-, :=, :? och :+ finns en motsvarande operator som skrivs utan kolon. Dessa operatorer undersöker bara om variabeln är odefinierad, inte om värdet är tomt.$ echo "Variabeln är ${OKAND+inte }odefinierad."
Variabeln är inte odefinierad.
$ echo "Variabeln är ${ODEFINIERAD+inte }odefinierad."
Variabeln är odefinierad.
$
Ovan är variabeln OKAND definierad (dess värde är den tomma strängen), medan variabeln ODEFINIERAD inte är definierad.

Uttrycket ${#variabel} skrivs om till antalet tecken i värdet av variabel.$ ORD=skalprogrammering
$ echo ${#ORD}
17
$

Uttrycket ${variabel: n} skrivs om till värdet av variabel men med de första n tecknen borttagna:$ echo ${ORD: 4}
programmering
$
Så här anger man att man vill behålla högst sju respektive högst 20 stycken tecken:$ echo ${ORD: 4: 7}
program
$ echo ${ORD: 4: 20}
programmering
$
Så här väljer vi ut de fyra sista tecknen:$ echo ${ORD: -4}
ring
$
Blanktecknet före talet -4 är viktigt, för annars skulle det förväxlas med operatorn :-.$ echo ${ORD:-4}
skalprogrammering
$
Härnäst vill vi behålla högst tre av de sex sista tecknen i värdet av variabeln ORD:$ echo ${ORD: -6: 3}
mer
$

Uttrycket ${variabel/mönster/sträng} skrivs om till värdet av variabel men med den första, längsta möjliga förekomsten av mönster utbytt mot sträng. Här tolkas mönster som ett mönster precis som när Bash matchar filnamn. I följande exempel byter vi ut den första förekomsten av a mot A:$ echo ${ORD/a/A}
skAlprogrammering
$
Uttrycket ${variabel//mönster/sträng} fungerar som det ovan bortsett från att varje förekomst av mönster byts mot sträng. Så här kan vi alltså ta bort alla vokaler:$ echo ${ORD//[aouåeiyäö]/}
sklprgrmmrng
$

Uttrycket ${variabel#mönster} innebär att den kortaste möjliga förekomsten av mönster i början av värdet av variabel ska tas bort. Så här stryker vi allt fram till det första blanktecknet:$ MENING='Hej, jag heter Göran!'
$ echo ${MENING#* }
jag heter Göran!
$
Operatorn ## fungerar som # bortsett från att det i stället är den längsta möjliga förekomsten av mönster som tas bort:$ echo ${MENING##* }
Göran!
$
Operatorerna % och %% fungerar som # respektive ## bortsett från att man stryker från slutet i stället. Så här kan man alltså byta ändelsen i ett filnamn:$ FIL=uppsats.tex
$ echo ${FIL%.*}.dvi
uppsats.dvi
$
Så här stryker vi allt som kommer efter det inledande decimaltalet:$ FORMEL=3.14+1.41-2.72
$ echo ${FORMEL%%[^0-9.]*}
3.14
$


next up previous contents
Nästa: 11.7 Aritmetik Upp: 11. Grundläggande Bashprogrammering Förra: 11.5 Att hantera argument
Goran Andersson
1999-03-08