Förklaring av bash-kommando för stringsplit

Permalänk

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##*:}

Permalänk
Medlem

Vilket är kommandot?

Skickades från m.sweclockers.com

Permalänk

@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?

Permalänk
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.

Permalänk
Medlem
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

Visa signatur

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