Рано чи пізно кожен, хто сидить у Linux, пише свій перший скрипт на Bash. Спершу це три рядки, щоб не набирати одні й ті самі команди руками, а потім – цілі програмки для резервних копій, обробки фото чи встановлення софту. І першим, з чим ти там зіткнешся, будуть змінні. Розберімося, як їх створювати, читати, рахувати й не наступати на граблі, на які наступав я сам 🙂

Що таке змінна в Bash

Змінна – це просто ім'я, під яким скрипт запам'ятовує якесь значення: текст, число, шлях до файлу, результат команди. Головна особливість Bash: тут немає типів. Усе – рядки, а числами вони стають лише тоді, коли ти явно просиш щось порахувати.

Як створити змінну

name="Андрій"
count=5
backup_dir="/home/andrii/backup"

І тут перші граблі: навколо знака = не повинно бути пробілів. Запис count = 5 Bash зрозуміє як команду count з аргументами = і 5 і чесно скаже, що такої команди не знайдено.

Імена змінних можуть містити латинські літери, цифри й підкреслення, але не можуть починатися з цифри. Великими літерами (PATH, HOME, USER) зазвичай називають системні змінні, тож для своїх краще брати маленькі, щоб випадково нічого не перезаписати.

Як використати значення змінної

Щоб дістати значення, перед ім'ям ставиш знак долара:

echo "Привіт, $name!"
echo "Файлів: ${count}"

Фігурні дужки потрібні, коли одразу після змінної йде текст, який Bash міг би прийняти за продовження імені:

file="photo"
echo "${file}_small.jpg"   # photo_small.jpg
echo "$file_small.jpg"     # .jpg — бо Bash шукає змінну file_small

Подвійні й одинарні лапки

  • Подвійні лапки "..." підставляють значення змінних: "Привіт, $name" → Привіт, Андрій.
  • Одинарні лапки '...' беруть текст буквально: 'Привіт, $name' → Привіт, $name.

І золоте правило: завжди бери змінні в подвійні лапки, особливо якщо там шлях до файлу. Без лапок назва «Мої фото» розвалиться на два окремі слова, і команда на кшталт rm $file може видалити зовсім не те, що ти думав/ла. З лапками – rm "$file" – усе працює правильно.

Як записати в змінну результат команди

Часто треба зберегти не готове значення, а те, що виведе якась команда. Для цього є конструкція $(...):

today=$(date +%Y-%m-%d)
files=$(ls | wc -l)
echo "Сьогодні $today, у теці $files файлів"

Наприклад, так зручно називати резервні копії датою: tar -czf "backup-$today.tar.gz" ~/Документи.

Арифметика

Оскільки все в Bash – рядки, то a=2+3 запише в змінну буквально текст «2+3». Щоб порахувати, потрібні подвійні дужки:

a=2
b=3
sum=$((a + b))
echo "$sum"        # 5
((count++))        # збільшити count на 1

Усередині $(( )) долар перед іменами можна не ставити, а пробіли – як завгодно. Але пам'ятай: Bash рахує лише цілі числа. $((7 / 2)) дасть 3, а не 3,5. Для дробів використовують утиліту bc.

Як прочитати значення з клавіатури

Щоб скрипт запитав щось у користувача, є команда read. Ось мій давній приклад: скрипт просить ввести число, а якщо нічого не ввели (просто натиснули Enter), бере 1000 за замовчуванням:

echo 'Вкажіть числове значення (1000 за замовчуванням):'
read counter
if [[ -z "$counter" ]]
then
    counter=1000
fi

-z перевіряє, чи рядок порожній. Але те саме можна записати коротше. read -p виводить підказку в тому ж рядку, а конструкція ${змінна:-значення} підставляє значення за замовчуванням, якщо змінна порожня:

read -p "Вкажіть числове значення (1000 за замовчуванням): " counter
counter=${counter:-1000}

Ще кілька корисних варіантів read:

  • read -s password – введення без відображення на екрані, для паролів;
  • read -t 10 answer – чекати відповідь не довше 10 секунд;
  • read -r line – не обробляти зворотні слеші, варто ставити майже завжди, коли читаєш рядки з файлу.

Аргументи скрипта і спеціальні змінні

Коли запускаєш скрипт із параметрами, наприклад ./resize.sh photo.jpg 800, вони потрапляють у спеціальні змінні:

  • $1, $2… – перший, другий аргумент (photo.jpg і 800);
  • $# – скільки аргументів передали;
  • "$@" – усі аргументи разом (саме в лапках!);
  • $0 – назва самого скрипта;
  • $? – код завершення попередньої команди: 0 – усе добре, будь-що інше – помилка.
if [[ $# -lt 2 ]]; then
    echo "Використання: $0 файл ширина"
    exit 1
fi
echo "Зменшую $1 до ширини $2 пікселів"

Змінні середовища і export

Звичайна змінна живе лише в поточному скрипті чи вікні терміналу. Якщо треба, щоб її бачили програми, які ти звідти запускаєш, її експортують:

export EDITOR=nano

Подивитися всі змінні середовища можна командою env, а конкретну – через echo "$HOME". Щоб змінна зберігалася після перезапуску терміналу, допиши рядок з export у файл ~/.bashrc.

Масиви: коли значень кілька

fruits=("яблуко" "груша" "слива")
echo "${fruits[0]}"        # яблуко
echo "${#fruits[@]}"       # 3 — кількість елементів
for f in "${fruits[@]}"; do
    echo "Люблю $f"
done

Нумерація, як і в більшості мов програмування, починається з нуля.

Типові помилки

  • Пробіли навколо = – найчастіша помилка новачка, про неї вище.
  • Змінна без лапок – працює, поки в значенні немає пробілів, а потім раптом ламається.
  • Долар при присвоєнні – $count=5 не працює, долар ставиться лише тоді, коли значення читаєш.
  • Одинарні лапки замість подвійних – і замість значення бачиш буквальне $name.

Порада наостанок: прожени свій скрипт через ShellCheck (є онлайн і як пакунок у будь-якому дистрибутиві). Він знаходить саме такі помилки зі змінними й лапками і пояснює, як виправити.

Що далі

Щоб швидше працювати в терміналі, тримай під рукою комбінації клавіш для терміналу Linux. А змінні найкраще тренувати на реальних задачах: наприклад, написати скрипт, який пакетно зменшує фото за допомогою утиліти convert з ImageMagick або перетворює відео через FFmpeg, – ім'я файлу і розмір якраз зручно передавати аргументами.

Більше про це – за позначками Bash скрипти та Консольні програми Linux.

А для чого ти пишеш скрипти на Bash? Пиши в коментарях 🙂