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
$