Проширења басха и шкољке: лење стварање листе

Опет је то доба године! Када продавнице почну да стављају шарене блиставо осветљене пластичне комадиће, сви почињемо да се осећамо помало свечано, а под празничним мислим да идемо у куповину. Конкретно, куповина празничних поклона! (Поклони за себе су технички и даље поклони.)

Само да ово све не полуди, треба да направите неке листе поклона. Басх може помоћи.

Проширење заграде

Ово нису заграде: ()

Нису ни ови: []

Ово су апаратићи:{}

Заграде поручују Басху да уради нешто са произвољним низом или жицама које пронађе између њих. Више жице су раздвојене зарезима: {a,b,c}. Такође можете додати опционалну преамбулу и постсцрипт који се прилажу уз сваки проширени резултат. Ово углавном може уштедети неко куцање, на пример са уобичајеним путањама датотека и екстензијама.

Направимо неке листе за сваку особу којој желимо да дамо ствари. Следеће команде су еквивалентне:

touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists /home/me/gift-lists ├── Amy.txt ├── Bryan.txt └── Charlie.txt

Ох, доврага, „Бриан“ своје име сриче с „и“. Могу то поправити.

mv /home/me/gift-lists/{Bryan,Brian}.txt renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'

Проширења параметара љуске

Проширење параметара љуске омогућава нам да вршимо све врсте промена параметара затворених у заграде, попут манипулације и замене текста.

Постоји неколико чарапа које сви наши дариватељи заслужују. Направимо то променљивом:

STUFF=$'socks\nlump of coal\nwhite chocolate' echo "$STUFF" socks lump of coal white chocolate

Сада да ове ставке додамо на сваку нашу листу уз помоћ teeкоманде за добијање echoи проширења да би се лепо играло.

echo "$STUFF" | tee {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks lump of coal white chocolate socks lump of coal white chocolate socks lump of coal white chocolate

Замена меча узорака

Кад боље размислим, можда грумен угља и није тако леп поклон. Можете га заменити нечим бољим користећи замену за подударање обрасца у облику ${parameter/pattern/string}:

echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks candy cane white chocolate socks candy cane white chocolate socks candy cane white chocolate

Ово замењује прву инстанцу „груде угља“ са „бомбоном“. Да бисте заменили све инстанце (ако их је било више), користите ${parameter//pattern/string}. Ово не мења нашу $STUFFпроменљиву, па и даље можемо поново користити оригиналну листу за некога несташног.

Поднизови

Иако побољшавамо ствари, наши дариваоци можда не воле белу чоколаду. Боље да на наше листе додамо мало редовне чоколаде за сваки случај. Пошто сам супер лењ, само ћу притиснути стрелицу нагоре и изменити претходну Басх наредбу. Срећом, последња реч у $STUFFпроменљивој је „чоколада“, која има девет знакова, па ћу рећи Басху да и даље користи само тај део ${parameter:offset}. Ја ћу користити tee-aзаставу aппенд са мојим постојећим листама:

echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks candy cane white chocolate chocolate socks candy cane white chocolate chocolate socks candy cane white chocolate chocolate

Можете такође:

Урадите Са овим
Набавите подниз од н знакова надаље ${parameter:n}
Набавите подниз за к знакова почев од н ${parameter:n:x}

Тамо! Сада су наше основне листе завршене. Узмимо мало јајета.

Испитивање променљивих

Знате, можда је у питању јајашце, али мислим да сам јуче креирао списак за Ејми и сачувао је у променљивој коју сам можда назвао amy. Да видимо да ли јесам. Користићу ${parameter:?word}проширење. Писаће wordу стандардну грешку и изаћи ако нема amyпараметра.

echo "${amy:?no such}" bash: amy: no such

Изгледа да не. Можда је то био Бриан?

echo "${brian:?no such}" Lederhosen

Можете такође:

Урадите Са овим
Замените wordако parameterније постављено или је ништавно ${parameter:-word}
Замените wordако parameterније поништено или ништавно ${parameter:+word}
Додели wordда parameterли parameterје невезаног или нула ${parameter:=word}

Промена случаја

That’s  right! Brian said he wanted some lederhosen and so I made myself a  note. This is pretty important, so I’ll add it to Brian’s list in  capital letters with the ${parameter^^pattern} expansion. The pattern part is optional. We’re only writing to Brian’s list, so I’ll just use >> instead of tee -a.

echo "${brian^^}" >> Brian.txt cat Brian.txt socks candy cane white chocolate chocolate LEDERHOSEN

You can also:

Do this With this
Capitalize the first letter ${parameter^pattern}
Lowercase the first letter ${parameter,pattern}
Lowercase all letters ${parameter,,pattern}

Expanding arrays

You know what, all this gift-listing business is a lot of work. I’m just going to make an array of things I saw at the store:

gifts=(sweater gameboy wagon pillows chestnuts hairbrush)

I can use substring expansion in the form of ${parameter:offset:length} to make this simple. I’ll add the first two to Amy’s list, the middle two to Brian’s, and the last two to Charlie’s. I’ll use printf to help with newlines.

printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt socks candy cane white chocolate chocolate sweater gameboy cat Brian.txt socks candy cane white chocolate chocolate LEDERHOSEN wagon pillows cat Charlie.txt socks candy cane white chocolate chocolate chestnuts hairbrush

Тамо! Сада имамо свеобухватан сет супер персонализованих листа поклона. Тханкс Басх! Штета што не може да обави куповину и за нас.