Förklaring av bash-kommando för stringsplit

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Förklaring av bash-kommando för stringsplit

Efter lite googlande så hittade jag följande kommando för att splitta en stäng med ":" som avgränsare. Allt funkar men jag skulle vilja veta hur det fungerar.

a="foo:bar" b=${a%:*} c=${a##*:}

Trädvy Permalänk
Medlem
Registrerad
Okt 2001

Vilket är kommandot?

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

@Linus:
{a%:*} och {a##*:}

variabeln b kommer efter detta att vara "foo" och variabeln c kommer att vara "bar". Är det någon form av reguljärt uttryck eller liknande?

Trädvy Permalänk
Medlem
Registrerad
Jan 2014
Skrivet av burton666:

Allt funkar men jag skulle vilja veta hur det fungerar.

Funktionen kallas Shell Parameter Expansion.

b=${a%:*}

betyder ungefär "ta innehållet i variabeln a, sök (%) fram till första förekomsten av sökmönstret : och returnera innehållet i a fram till (*) sökmönstret.

c=${a##*:}

betyder ungefär samma sak, men sökningen görs från slutet på strängen och fram till sista (eh, första från slutet) förekomsten av strängen.

* och # matchar så lång del av strängen som möjligt.
** och ## matchar så kort del av strängen som möjligt.

Kommandot cut (som i "echo a | cut --delimiter=':' --fields=1,2,4,...) kan hugga upp strängar i >2 delar och är imho lite läsligare.

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004
Skrivet av burton666:

Efter lite googlande så hittade jag följande kommando för att splitta en stäng med ":" som avgränsare. Allt funkar men jag skulle vilja veta hur det fungerar.

a="foo:bar" b=${a%:*} c=${a##*:}

b matchar och spar den delen medan c matchar och klipper bort tror jag, det var ett tag sedan jag gjorde något i bash

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood