Привіт усім! В даній статті висвітлено спеціальні вирази командного інтерпретатора Bash, які дозволяють отримувати ціле, часткове, модифіковане або стандартне значення змінної або параметра скрипта.

Вирази параметрів

${parameter:−word}
Використання значення за умовчанням. Якщо змінна parameter не встановлена або має значення null, конструкція повертає значення виразу word. В іншому випадку повертається значення змінної parameter.
${parameter:=word}
Присвоєння значення за умовчанням. Якщо параметр parameter не встановлений або пустий, значення виразу word присвоюється змінній parameter за умовчанням. Після цього конструкція повертає значення parameter. Таким чином заборонено присвоювання значення параметрам скрипта ($0 - ${N}) і спеціальним параметрам.
${parameter:?word}
Вивід повідомлення про помилку. Якщо змінна parameter не встановлена або пуста, значення виразу word направляється у стандартний потік виводу помилок, і командний інтерпретатор, якщо він не інтерактивний, завершує свою роботу. В іншому випадку конструкція повертає значення parameter.
${parameter:+word}
Використання альтернативного значення. Якщо змінна parameter не встановлена або рівна null, повертається пусте значення, в іншому випадку повертається значення виразу word.
${parameter:offset}
${parameter:offset:length}
Вираз отримання підрядка. Повертає значення параметра parameter довжиною length символів, починаючи від номеру символа вказаного в якості виразу offset. Якщо параметр length не вказано, конструкція повертає значення підрядка починаючи з символу, який міститься за номером offset. Параметри length і offset повинні являтися арифметичними виразами. Параметр length повинен розраховуватися в значення більше або рівне нулю. Якщо параметр-вираз offset розраховується в значення менше від нуля, значення інтерпретується в якості зміщення з кінця рядка parameter. Якщо змінна parameter являється символом “@”, результатом конструкції являється значення параметрів скрипта в кількості length починаючи від параметра за номером offset. Якщо параметр parameter, являється індексованим масивом, індексом якого являється символ “@” або “*”, результатом являється елементи масиву в кількості length починаючи від ${parameter[offset]}. Негативне зміщення offset інтерпретується відносно позиції на одиницю більшу, ніж максимальний індекс вказаного масиву. Зауважте, що негативне зміщення повинно бути відокремлене від символу двокрапки хоча б одним пробілом для запобігання хибної інтерпретації конструкції “:-”. Індексування елементів рядка починається від нуля. Індексування параметрів скрипта за умовчанням починається з 1. Якщо зміщення offset рівне 0 і використовуються параметри скрипта, параметр $0 вставляється в початок поверненого значення.
${!prefix*}
${!prefix@}
Імена яким відповідає вказаний префікс. Розширюється в назви змінних, імена яких починаються з вказаного префікса prefix, розділені першим символом, який міститься в спеціальній змінній середовища IFS. При використанні символа @, і розрахування відбувається у подвійних дужках, кожне ім'я повертається в якості окремого слова.
${!name[@]}
${!name[*]}
Список ключів масиву. Якщо змінна name являється масивом, дана конструкція повертає список ключів масиву, які присутні в name. Якщо змінна name не являється масивом, конструкція повертає 0 якщо name існує і null в іншому випадку. Під час використання символа “@”, коли конструкція міститься у подвійних дужках, кожний ключ повертається в якості окремого слова.
${#parameter}
Довжина значення змінної. Дана конструкція повертає довжину значення змінної в символах. Якщо змінна parameter являється “*” або “@”, повернене значення являє собою кількість елементів у масиві.
${parameter#word}
${parameter##word}
Видалення першого підрядка, який відповідає шаблону. Вираз word розраховується в якості шаблону. Якщо шаблон співпадає з початком значення параметру parameter, в такому разі конструкція повертає значення з видаленим найкоротшим підрядком (з під час використання одинарного “#”), який відповідає шаблону word, або видаленим найдовшим підрядком (у випадку використання подвійного “##”). Якщо параметр являється символом @ або *, видалення підрядка, який відповідає шаблону виконується з кожним параметром скрипта окремо. Якщо parameter являється масивом, індекс якого являється симолом “@” або “*”, операція видалення підрядка, який відповідає шаблону word, застосовується до кожного елемента масиву і конструкція повертає модифікований список.
${parameter%word}
${parameter%%word}
Видалення останнього підрядка, який відповідає шаблону. Вираз word інтерпретується в якості шаблону. Якщо шаблон відповідає кінцевій частині значення змінної parameter, тоді поверненим значенням конструкції являється значення змінної parameter з видаленим найкоротшим підрядком який відповідає шаблону word (у випадку одинарного %), або з видаленим найдовшим підрядком, який відповідає шаблону word (у випадку використання подвійного %%). Якщо параметром parameter являється символ “@” або “*”, операція видалення підрядка, який відповідає шаблону word, застосовується до кожного елементу параметрів скрипта окремо і результатом являється відповідний модифікований список. Якщо параметром parameter являється масив з вказаним індексом, в якості якого виступає символ “@” або “*”, операція видалення підрядка застосовується до кожного елементу окремо.
${parameter/pattern/string}
Заміна підрядка. Параметр конструкції pattern розглядається в якості шаблона. Значення найдовшого підрядка параметру parameter, який відповідає шаблону pattern, замінюється на значення string. Якщо шаблон pattern починається з символа “/”, замінюються усі випадки підрядків, які відповідають шаблону pattern. Зазвичай замінюється тільки перший випадок. Якщо шаблон pattern починається з символу “#”, тоді для заміни підрядка, шаблон повинен успішно співставитись з початком значення параметру parameter. Якщо параметр pattern починається з символу %, тоді для заміни підрядка з значення змінної parameter, він повинен успішно співставитись з кінцем значення parameter. Якщо string являється пустим значенням, підрядки, які відповідають шаблону pattern будуть видалятися. Якщо параметр parameter являє собою символ “@” або “*”, операція заміни виконується окремо до кожного елемента параметрів скрипта, як і до кожного елемента масиву, який проіндексований одним з цих двох символів.
${parameterˆpattern}
${parameterˆˆpattern}
${parameter,pattern}
${parameter,,pattern}
Модифікація регістру. Дана конструкція модифікує регістр буквених символів у значенні змінної parameter. Параметр конструкції pattern розглядається в якості шаблону. Оператор “^” перетворює символи нижнього регістру, які відповідають шаблону pattern у верхній регістр; оператор “,” перетворює літери у верхньому регістрі, які відповідають шаблону, в нижній. Оператори “^^” і “,,” перетворюють кожний випадок успішного співставленого шаблону; опретори “^” і “,” перетворюють тільки перший успішно співставлений з шаблоном pattern символ. Якщо шаблон pattern не вказаний, він трактується як “?”, який успішно співставляється з кожним символом. Якщо змінна parameter являє собою символи @ або *, модифікація регістру відбувається з кожним параметром окремо і результатом являється модифікований список (це відноситься і до масиву, який проіндексований одним з даних символів).

Приклад

Розглянемо наступний скрипт, який демонструє використання деяких з вищевказаних конструкцій:
#!/bin/bash

# змінна, над якою будуть виконуватися експерименти
value="Даний скрипт завантажено з www.kytok.org.ua"

# виводимо оригінальне значення змінної для наглядності
echo "Оригінальне значення \$value: '$value'"

# використовуємо різні конструкції для демонстрації
echo "Результат конструкції \${value:27:16}: '${value:27:16}'"
echo "Результат конструкції \${#value}: '${#value}'"
echo "Результат конструкції \${value// /_}: '${value// /_}'"
echo "Результат конструкції \${value^^[сз]}: '${value^^[сз]}'"
echo "Результат конструкції \${value^^[[:ascii:]]}: '${value^^[[:ascii:]]}'"
echo "Результат конструкції \${value// /_}: '${value// /_}'"
echo "Результат конструкції \${value##w*}: '${value##w*}'"
echo "Результат конструкції \${value%%w*}: '${value%%w*}'"
echo "Результат конструкції \${value%w*}: '${value%w*}'"
Результатом виконання даного скрипта може являтись наступний вивід (скрипт знаходиться у файлі script.sh): bash_parameter_expanshion_examples_script_output