Наши скрипты пока работают в одну сторону — выводят информацию. Но настоящий скрипт должен уметь спрашивать. «Какой файл обработать?», «Удалить старые логи? (y/n)», «Введите имя пользователя» — интерактивность делает скрипт универсальным. echo — вывод текста**
echo мы уже используем постоянно, но есть пара трюков, которые стоит знать:
# Обычный вывод
echo "Привет"
# Без перевода строки в конце (следующий вывод будет на той же строке)
echo -n "Загрузка... "
# Интерпретация спецсимволов: табуляция, перевод строки
echo -e "Имя:\tАлекс\nВозраст:\t25"
Имя: Алекс
Возраст: 25
Флаг -n — не добавлять перевод строки. -e — интерпретировать \t (табуляция) и \n (новая строка).
printf — форматированный вывод**
Когда нужен точный контроль над форматом — printf надёжнее, чем echo:
name="Алекс"
score=95
printf "Студент: %s, балл: %d\n" "$name" "$score"
Студент: Алекс, балл: 95
printf отлично подходит для таблиц и выровненного вывода:
printf "%-15s %5s %10s\n" "Имя" "Возраст" "Город"
printf "%-15s %5d %10s\n" "Алекс" 25 "Москва"
printf "%-15s %5d %10s\n" "Мария" 30 "Петербург"
Имя Возраст Город
Алекс 25 Москва
Мария 30 Петербург
%-15s — строка, выровненная влево, шириной 15 символов. %5d — число, шириной 5 символов, выровненное вправо.
read — ввод от пользователя**
Вот где скрипт становится интерактивным:
#!/bin/bash
echo -n "Как вас зовут? "
read name
echo "Привет, $name!"
Как вас зовут? Алекс
Привет, Алекс!
Команда read останавливает скрипт и ждёт, пока пользователь введёт текст и нажмёт Enter. Введённое значение записывается в переменную.
Удобный флаг -p — совмещает приглашение и ввод в одной команде:
read -p "Введите директорию для бэкапа: " backup_dir
echo "Буду копировать из: $backup_dir"
Ещё полезные флаги:
# Скрытый ввод (для паролей) — символы не отображаются
read -sp "Пароль: " password
echo "" # Перевод строки после скрытого ввода
echo "Пароль принят (длина: ${#password} символов)"
# Таймаут — ждать не больше 10 секунд
read -t 10 -p "Введите за 10 секунд: " answer
Практический пример — подтверждение опасного действия:
#!/bin/bash
read -p "Удалить все логи старше 30 дней? (y/n): " confirm
if [ "$confirm" = "y" ]; then
echo "Удаляю..."
find /var/log/app -name "*.log" -mtime +30 -delete 2>/dev/null
echo "Готово."
else
echo "Отменено."
fi
Не пугайтесь конструкции if — мы разберём её подробно в следующем уроке. Сейчас важен read: скрипт спрашивает подтверждение перед опасным действием.
Код возврата — $? и exit**
Каждая команда в Linux после завершения возвращает число — код возврата. Это число говорит: «я завершилась успешно» или «что-то пошло не так».
ls /etc > /dev/null
echo $?
0
Успех — директория существует, ls отработал.
ls /несуществующая > /dev/null 2>&1
echo $?
2
Ошибка — директории нет, код возврата не 0.
Почему это важно? Потому что if в Bash проверяет именно код возврата. Условие «истинно» — если команда вернула 0. «Ложно» — если не 0. Мы увидим это в следующем уроке.
В собственных скриптах вы можете задать код возврата через exit:
#!/bin/bash
if [ ! -f "$1" ]; then
echo "Ошибка: файл $1 не найден" >&2
exit 1
fi
echo "Обрабатываю $1..."
exit 0
exit 0 — скрипт завершился успешно. exit 1 — с ошибкой. Это позволяет другим скриптам проверять, отработал ли ваш скрипт корректно.
Шпаргалка:
| Команда | Что делает |
|---|---|
echo "text" |
Вывести текст |
echo -n "text" |
Вывести без перевода строки |
echo -e "a\tb" |
Интерпретировать спецсимволы |
printf "%s %d\n" a 1 |
Форматированный вывод |
read var |
Считать ввод пользователя в переменную |
read -p "?" var |
Приглашение + ввод |
read -s var |
Скрытый ввод (пароли) |
$? |
Код возврата последней команды |
exit 0 |
Завершить скрипт с кодом 0 (успех) |
exit 1 |
Завершить скрипт с кодом 1 (ошибка) |
В следующем уроке — условия. if, else, проверки файлов, сравнение строк и чисел. Скрипт научится принимать решения.
echo — вывод текста. -n — без перевода строки. -e — спецсимволы (\t, \n).
printf — форматированный вывод. %s — строка, %d — число. Не добавляет \n автоматически. Надёжнее echo для кроссплатформенных скриптов.
read — считать ввод пользователя. -p — приглашение. -s — скрытый ввод. -t N — таймаут.
Код возврата ($?) — 0 = успех, не 0 = ошибка. exit N — завершить скрипт с кодом N. Ошибки выводятся в stderr (>&2).