David Andersson skrev:Ta ut delsträngar
Förutom att plocka bort saker i parameterexpansion kan man använda nån av kommandona
basename,
dirname och
expr .
Exempel
Kod: Markera allt
dirname /a/b/c
basename /a/b/c
expr "abc47def" : "[^0-9]*\([0-9]*\)"
dir=$(dirname "$mypath")
base=$(basename "$mypath")
digits=$(expr "$mystring" : "[^0-9]*\([0-9]*\)")
(Basename och dirname är gjorda så att när man plockat isär en path med dem så kan man sätta ihop delarna med / emellan och få tillbaka samma path. Inte alltid samma sträng, men en path som går till samma ställe. Den förstår dubbla // och sånt.)
Det lustiga är att jag själv redan tittat på både dirname och basename, men dömde ut dem efter några snabba tester, för de gjorde inte det jag ville. Men nu när du åter tar upp det hela gjorde jag flera tester och fann att de visst gör det jag vill, om man bara tänker till lite.
Vad jag har som utgångspunkt är ju följande:
Vad jag vill ha är detta;
Den enkla sats som fixar detta ser givetvis ut så här, om sökvägen finns i variabeln ”a”:
Alternativ:
En liten följdfråga bara, när det gäller skalprogrammering (sh) i allmänhet:
Kan man alltid ersätta `<uttryck>` med $(<uttryck>) eller är detta bara ett specialfall? Båda varianterna fungerade i alla fall, men ` sitter lite avigt till på mitt tangentbord, trots att jag gjort min egen layout. Använder jag $() istället slipper jag ju göra om min tangentbordslayout igen…
David Andersson skrev:I expr finns vanlig tråkig
substr, men den använder man aldrig. Påminner alldeles för myckt om Basic och Java.
Exempel
(Edit: [[ ... ]] finns inte i sh)
Fast å andra sidan, om något är tråkigt eller inte spelar ju mindre roll om enda målet är att få jobbet gjort. Jag har lättare att köpa argument som de mer handlar om prestanda och dylikt. När jag själv hittar flera olika alternativ och ska välja ett brukar jag ta tid på dem. Skiljer det mycket tar jag det snabbaste. Skiljer det lite kanske jag väljer det som ser mest lättläst ut eller som slukar minst resurser eller det som bäst matchar koden i övrigt. Men snabbhet är prio 0 för mig. Eller prio 1 kanske man brukar säga.
I just detta fall visade sig båda vara lika snabba. Ibland var den ena lite snabbare, ibland den andra. Här är en av testerna:
Kod: Markera allt
$ a="/home/guraknugen/Eget/"
$ time for i in $(seq 1 1000); do b="$(dirname $a)/$(basename $a)"; done
real 0m9.523s
user 0m4.392s
sys 0m5.324s
$ time for i in $(seq 1 1000); do b="`dirname $a`/`basename $a`"; done
real 0m9.585s
user 0m4.292s
sys 0m5.276s
$ echo $b
/home/guraknugen/Eget
I stort sett samma tid tog det, som synes. Det blir som sagt lite olika varje gång.