Перейти к основному содержимому

Bash — однострочники и скрипты

Готовые команды и скрипты Bash с разбором каждой важной части: скопировали однострочник → вставили в терминал → увидели результат; или сохранили .shchmod +x → запустили. Подойдёт, если вы ищете «bash read file line by line», «bash script example», «bash count lines in file», «bash for loop files», «bash if file exists», «linux shell script пример» или «однострочник grep find».

Здесь упор на понятный смысл и типовые запросы из поиска. Строгий каркас для cron и деплоя — в Примеры скриптов в Linux. HTTP и JSON — curl / fetch. Стиль галереи с разбором — как в Turtle на Python и Python — файлы и текст.


Основы Bash в терминале

Bash (Bourne Again Shell) — программа, которая читает вашу строку, запускает утилиты (cat, grep, find…) и может выполнять файлы .sh. В Linux и macOS Bash часто стоит по умолчанию; в Windows удобно WSL или Git Bash.

Однострочник — цепочка команд в одной строке, часто через | (pipe): вывод слева становится входом справа.

Скрипт — текстовый файл с командами; первая строка #!/usr/bin/env bash говорит системе, чем его выполнять.

С чего начать в теории

Установка и первый запуск — Первая программа на Bash. Кавычки, тесты [[ ]], циклы — Синтаксис и Условия и циклы. Знаки |, >, $()Терминал, знаки препинания. Опасные команды из чата — Опасные скрипты.

Частые запросы в Google — куда смотреть

Ищут в интернете (RU / EN)Раздел ниже
bash read file / bash прочитать файлcat и less · Построчно
bash read file line by linewhile read · Скрипт суммы
bash count lines / wc -lwc
bash write to file / записать в файлecho и >> · Here-document
bash if file existsПроверка -f
bash for loop / цикл по файламfor по маске
bash script arguments $1Аргументы
bash grep recursive / найти текст в папкеgrep -R
bash find files by namefind
bash sort uniq / подсчёт повторовsort | uniq
bash backup tar.gzАрхив
bash set -euo pipefailШаблон скрипта
linux shell script exampleСтартовые скрипты
bash hello world scriptПривет, аргумент

Какую команду выбрать

Вам нужно…Откройте примерЧто скопировать
Быстро посмотреть файлcatcat file.txt
Большой лог пролистатьlessless app.log
Посчитать строкиwcwc -l file.txt
Дописать строку в лог>>echo "…" >> log.txt
Пройти файл построчно в терминалеwhile readцикл while read -r
Проверить, есть ли файл[ -f ][[ -f path ]]
Все .py в папкеforfor f in ./*.py
Найти слово в проектеgrepgrep -RIn "TODO" .
Сохранить как скриптШаблонпервые 3 строки + ваш код

Как запустить за 30 секунд

Однострочник

  1. Откройте терминал в нужной папке (cd в каталог с файлами).
  2. Вставьте команду целиком, Enter.
  3. Смотрите вывод в консоли.

Скрипт

  1. Создайте demo.sh, вставьте код (с #!/usr/bin/env bash).
  2. В той же папке:
chmod +x demo.sh
./demo.sh
  1. Либо без прав на выполнение: bash demo.sh.
СредаГде терминал
Ubuntu / DebianCtrl+Alt+T
macOSTerminal.app
WindowsWSL или Git Bash из меню Пуск
Кому подойдёт эта страница

Школьникам — лабораторная «скрипт обработки файла», отчёт по информатике, кружок робототехники с Linux.

Студентам — курс ОС, DevOps-введение, администрирование, сдача ДЗ на удалённом сервере по SSH.

Самоучкам — pet-проект, бэкап папки, разбор лога, подготовка к собеседованию «базовый Linux».


Базовые термины

ТерминПростыми словами
ShellОболочка: читает команды и запускает программы
BashСамый частый shell в учебниках и на серверах
КомандаИмя программы + аргументы: wc -l file.txt
Пайплайнcmd1 | cmd2 — stdout первой команды → stdin второй
Перенаправление> перезапись файла, &gt;&gt; дописывание, < ввод из файла
Переменнаяname="Алиса" · обращение "$name"
Код возвратаЧисло 0 = успех; другое = ошибка (важно для скриптов)
ShebangПервая строка #!/usr/bin/env bash в файле скрипта

Обязательный шаблон скрипта

Любой учебный или рабочий скрипт, который вы сохраняете в файл, удобно начинать так:

#!/usr/bin/env bash
set -euo pipefail

# ваш код
echo "Готово"

Разбор по строкам.

СтрокаЧто происходитЗачем запомнить
#!/usr/bin/env bashenv ищет bash в PATH и передаёт ему файлРаботает в разных дистрибутивах
set -eВыйти при ошибке любой командыСкрипт останавливается, а не «едет» дальше
set -uОшибка при $несуществующаяЛовит опечатки в именах переменных
set -o pipefailОшибка в a | b, даже если b успешенЧестный код возврата пайплайна
echo "Готово"Печать в stdoutВидно, что скрипт дошёл до конца

Что увидите в терминале после ./demo.sh:

Готово

Типичные ошибки.

  • Файл сохранён в Windows с окончаниями строк CRLF → bash\r: No such file. Решение: редактор в режиме LF или dos2unix demo.sh.
  • Забыли chmod +xPermission denied. Решение: chmod +x demo.sh или bash demo.sh.
  • Запускаете из другой папки → скрипт не находит data.txt. Решение: cd в каталог с данными или укажите полный путь.

Полный каркас с trap, getopts и логами — шаблон production.


Стартовые однострочники

Команды, которые чаще всего копируют из поиска на первом занятии по Linux.


Показать файл — cat

Задача. Вывести содержимое маленького текстового файла на экран.

cat notes.txt

Разбор.

ЧастьСмысл
catConcatenate — «склеить и показать»; для одного файла просто печатает его
notes.txtПуть к файлу относительно текущей папки терминала

Что увидите (если в notes.txt две строки):

Первая строка
Вторая строка

Смысл приёма. cat — самый короткий способ проверить «что внутри файла» перед обработкой.

Частая ошибка. cat на огромном логе — тысячи строк пролетают мимо. Для больших файлов — less.

Попробуйте сами. echo "тест" > notes.txt затем cat notes.txt.


Пролистать большой файл — less

Задача. Открыть длинный лог и читать по экрану.

less /var/log/syslog

Разбор.

КлавишаДействие
ПробелСтраница вниз
bСтраница вверх
/ERRORПоиск вперёд по слову ERROR
qВыход

Смысл приёма. less ничего не меняет в файле — только просмотр.


Подсчёт строк — wc

Задача. Узнать, сколько строк в файле (частый вопрос в лабораторной).

wc -l students.txt

Разбор.

ЧастьСмысл
wcWord count — считает строки, слова, байты
-lТолько lines (строки)
вывод 42 students.txt42 строки в файле students.txt

Только число без имени файла:

wc -l < students.txt

Здесь < students.txt подаёт файл на вход wc, поэтому в выводе одно число.

Частая ошибка. Считать строки через cat file | wc -l — работает, но лишний процесс; достаточно wc -l file.


Записать и дописать в файл — echo

Задача. Создать одну строку в новом файле и дописать вторую без удаления первой.

echo "строка 1" > new.txt
echo "строка 2" >> new.txt
cat new.txt

Разбор.

ОператорДействиеАналогия
>Перезаписать файл (старое содержимое стирается)«Новый лист»
&gt;&gt;Дописать в конец«Добавить в конец тетради»
echo "текст"Печать текста в stdout
echo … > fileПеренаправить stdout в файл

Что увидите:

строка 1
строка 2

Смысл приёма. Простейшее логирование: каждый запуск скрипта добавляет строку в app.log.

Частая ошибка. Второй раз открыли с > вместо &gt;&gt; — первая запись исчезла.

С датой в лог:

echo "$(date -Iseconds) запуск OK" >> backup.log
ФрагментСмысл
$(date -Iseconds)Подстановка: выполнить date и подставить результат
-IsecondsISO-формат с секундами

Несколько строк в файл — here-document

Задача. Создать файл из трёх строк без редактора nano/vim.

cat > config.txt <<'EOF'
host=localhost
port=8080
debug=true
EOF

Разбор.

СтрокаСмысл
cat > config.txtВсё, что «печатает» cat, идёт в config.txt
&lt;&lt;'EOF'Читать строки до строки EOF на отдельной строке
кавычки в 'EOF'Внутри не раскрывать $переменные
финальный EOFКонец ввода, без пробелов перед ним

Смысл приёма. Удобно в скриптах генерировать маленький конфиг или SQL.


Построчное чтение в однострочнике

Задача. Для каждой строки data.txt напечатать её с префиксом.

while IFS= read -r line; do
printf '>> %s\n' "$line"
done < data.txt

Разбор построчно.

ФрагментСмысл
while … do … doneЦикл, пока read возвращает успех
IFS= read -r lineПрочитать одну строку; -r — не трогать обратный слэш
IFS=Не обрезать пробелы по краям при чтении (тонкая настройка)
"$line"Кавычки — имя файла с пробелами не разобьёт команду
< data.txtВвод цикла из файла, а не с клавиатуры
printf '&gt;&gt; %s\n'Форматированный вывод (надёжнее echo для спецсимволов)

Тестовый data.txt:

alpha
beta
gamma

Вывод:

>> alpha
>> beta
>> gamma

Смысл приёма. Тот же паттерн, что for line in f: в Python — основа для подсчёта, фильтра лога, парсинга CSV без библиотек.


Проверка, что файл существует

Задача. Напечатать «есть» или «нет» для config.json.

if [[ -f config.json ]]; then
echo "файл есть"
else
echo "файла нет"
fi

Разбор.

ТестПроверяет
-f путьОбычный файл существует
-d путьКаталог
-r путьЧитаем
-x путьИсполняемый
[[ … ]]Условие Bash (пробелы внутри обязательны)

Однострочник для быстрой проверки:

[[ -f config.json ]] && echo "есть" || echo "нет"
ЧастьСмысл
&&Выполнить справа, только если слева успех (код 0)
`

Однострочники — поиск, сортировка, файлы


Найти текст в папке — grep

Задача. Показать все строки с словом error в проекте (регистр как в файле).

grep -RIn "error" ./src/

Разбор флагов.

ФлагДействие
-RРекурсивно по каталогам
-IПропускать бинарники
-nНомер строки
"error"Шаблон поиска (здесь простая подстрока)
./src/Где искать

Только имена файлов, где есть совпадение:

grep -Rl "TODO" .

Смысл приёма. Быстрый аудит кода и логов перед экзаменом или релизом.

Сложные шаблоны — Regex — готовые паттерны.


Хвост лога в реальном времени

tail -n 30 -f app.log
ФлагСмысл
-n 30Последние 30 строк
-fFollow — ждать новые строки (как «живой» лог)

Остановка: Ctrl+C.


Подсчёт повторяющихся строк

Задача. Топ-5 самых частых IP в списке (по одному IP на строку).

sort ips.txt | uniq -c | sort -nr | head -n 5

Разбор пайплайна слева направо.

ШагКомандаЧто делает
1sort ips.txtСортирует строки; одинаковые становятся соседями
2uniq -cСчитает подряд идущие одинаковые
3sort -nrСортировка по числу в начале строки, по убыванию
4head -n 5Взять первые 5 строк

Смысл приёма. Классический однострочник аналитики без Python и Excel.

Частая ошибка. uniq без предварительного sort — считает только соседние дубликаты.


Найти файлы по имени — find

Задача. Список всех .py в текущем дереве.

find . -type f -name '*.py'

Разбор.

ЧастьСмысл
.Старт — текущая папка
-type fТолько файлы
-name '*.py'Маска имени; кавычки защищают * от shell

С пробелами в именах (для ls или архивации):

find . -type f -name '*.log' -print0 | xargs -0 ls -lh
ЧастьСмысл
-print0Пути через символ NUL
xargs -0Читать аргументы с NUL — безопасно для пробелов

Стартовые скрипты

Пять файлов, с которых обычно сдают первую лабораторную по shell.


Привет, мир с аргументом

Задача. Скрипт печатает приветствие; имя — первый аргумент или «мир».

#!/usr/bin/env bash
set -euo pipefail

name="${1:-мир}"
echo "Привет, ${name}!"

Разбор.

СтрокаСмысл
$&#123;1:-мир&#125;Первый аргумент $1; если пусто — подставить «мир»
"$&#123;name&#125;"Кавычки при подстановке — обязательная привычка

Запуск и вывод:

./hello.sh Алиса
Привет, Алиса!
./hello.sh
Привет, мир!

Попробуйте сами. Добавьте второй аргумент — фамилию — и выведите оба через "$1" и "$2".


Все аргументы командной строки

Задача. Показать, как Bash видит параметры скрипта.

#!/usr/bin/env bash
set -euo pipefail

echo "Имя скрипта (путь): $0"
echo "Количество аргументов: $#"
echo "Все слова одной строкой: $*"
echo "Первый аргумент: ${1:-<нет>}"

Разбор переменных.

ПеременнаяСодержимое
$0Как вызвали скрипт (./demo.sh)
$#Сколько аргументов передано
$*Все аргументы
$1, $2, …По одному
$@Все аргументы как отдельные слова (в циклах часто лучше $*)

Запуск:

./args.sh one two three

Вывод (пример):

Имя скрипта (путь): ./args.sh
Количество аргументов: 3
Все слова одной строкой: one two three
Первый аргумент: one

Цикл по файлам в папке

Задача. Для каждого .txt вывести имя и число строк.

#!/usr/bin/env bash
set -euo pipefail

shopt -s nullglob

for path in ./*.txt; do
lines=$(wc -l < "$path")
printf '%s: %s строк\n' "$(basename "$path")" "$lines"
done

Разбор.

СтрокаСмысл
shopt -s nullglobЕсли нет .txt, цикл не выполнится с буквальной маской *.txt
for path in ./*.txtПеребор файлов по шаблону в текущей папке
wc -l < "$path"Подсчёт строк без имени файла в выводе
basename "$path"Только имя файла без ./

Подготовка для проверки:

echo "a" > one.txt
echo -e "b\nc" > two.txt
./count_txt.sh

Ожидаемый вывод:

one.txt: 1 строк
two.txt: 2 строк

Частая ошибка. for f in $(ls *.txt) — ломается на пробелах в имени. Используйте for f in ./*.txt.


Сумма чисел из файла

Задача. В numbers.txt по одному целому на строку — вывести сумму.

#!/usr/bin/env bash
set -euo pipefail

sum=0
while IFS= read -r line || [[ -n "$line" ]]; do
[[ -z "$line" ]] && continue
sum=$((sum + line))
done < numbers.txt

echo "Сумма: $sum"

Разбор.

СтрокаСмысл
sum=0Инициализация (без пробелов вокруг =)
read -r lineОдна строка без интерпретации \
`
[[ -z "$line" ]] && continueПропустить пустые строки
$((sum + line))Арифметика целых в Bash
< numbers.txtВвод цикла из файла

numbers.txt:

10
20
30

Вывод: Сумма: 60

Смысл приёма. Типовая формулировка задания: «прочитать файл и посчитать».


Проверка — файл или каталог

#!/usr/bin/env bash
set -euo pipefail

target="${1:?укажите путь: $0 <путь>}"

if [[ -d "$target" ]]; then
count=$(find "$target" -type f | wc -l)
echo "Каталог. Файлов внутри: $count"
elif [[ -f "$target" ]]; then
bytes=$(wc -c < "$target")
echo "Файл. Размер: $bytes байт"
else
echo "Не найдено: $target" >&2
exit 1
fi
КонструкцияСмысл
$&#123;1:?текст&#125;Нет аргумента — сообщение и выход с ошибкой
>&2Печать в stderr (поток ошибок)
exit 1Код «неуспех» для проверяющей системы

Практические мини-задачи

Формулировки, близкие к школьным и вузовским лабораторным.


8.1. Подсчёт слов в файле

Задача. Вывести число слов в essay.txt.

wc -w < essay.txt
ФлагСмысл
-wwords — слова

Скрипт-обёртка:

#!/usr/bin/env bash
set -euo pipefail
file="${1:?укажите файл}"
words=$(wc -w < "$file")
echo "Слов в $file: $words"

8.2. Фильтр строк лога по ERROR

Задача. Из server.log вывести только строки с ERROR.

grep 'ERROR' server.log

Сохранить в новый файл:

grep 'ERROR' server.log > errors-only.log

Разбор: grep читает файл построчно; шаблон — подстрока. В Python тот же смысл — фильтр лога.

Скрипт с подсчётом:

#!/usr/bin/env bash
set -euo pipefail
log="${1:?файл лога}"
count=$(grep -c 'ERROR' "$log" || true)
echo "Строк с ERROR: $count"

|| true — если совпадений 0, grep -c вернёт код 1; с set -e без || true скрипт оборвётся.


8.3. Переименование фото по порядку

#!/usr/bin/env bash
set -euo pipefail

prefix="${1:?нужен префикс, например photo}"

shopt -s nullglob
n=1
for f in *.jpg; do
new="${prefix}_$(printf '%03d' "$n").jpg"
mv -n -- "$f" "$new"
echo "$f -> $new"
n=$((n + 1))
done
ЧастьСмысл
printf '%03d' "$n"001, 002, …
mv -nНе перезаписывать, если цель есть
--Конец опций mv

Перед боевым запуском замените mv на echo mv и проверьте список.


8.4. Топ-10 IP в access.log (упрощённо)

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
КомандаРоль
awk '&#123;print $1&#125;'Первый столбец строки (здесь считаем, что это IP)
остальноепайплайн sort/uniq

Реальные логи сложнее — см. Regex или Python.


8.5. Архив папки с датой в имени

#!/usr/bin/env bash
set -euo pipefail

src="${1:?каталог-источник}"
dst="${2:-.}"
stamp="$(date +%Y%m%d_%H%M%S)"
out="${dst}/backup_${stamp}.tar.gz"

tar -czf "$out" -C "$src" .
echo "Создан архив: $out"
ЧастьСмысл
tar -czfСоздать gzip-архив
-C "$src" .Упаковать содержимое каталога, пути без лишнего префикса
date +%Y%m%d_%H%M%SМетка времени в имени файла

Скрипт с функцией log

Задача. Печатать сообщения с временем UTC — привычка для отчётов и серверов.

#!/usr/bin/env bash
set -euo pipefail

log() {
printf '[%s] %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$*"
}

log "старт обработки"
# … ваша работа …
log "готово"
СтрокаСмысл
log() { … }Объявление функции
"$*"Все аргументы вызова log одной строкой
date -uВремя в UTC

Частые вопросы

Чем эта глава отличается от Примеры скриптов в Linux?
Здесь — галерея с разбором для учёбы и поиска. В 113 — короткий production-минимум: trap, getopts, health-check.

Bash на Windows без Linux?
Установите Git for Windows (Git Bash) или WSL. Пути вида /c/Users/… в Git Bash и /mnt/c/… в WSL различаются — запускайте скрипт из той среды, где создавали файлы.

Почему $'\r': command not found?
Файл сохранён с окончаниями Windows (CRLF). Сохраните в UTF-8 LF или выполните dos2unix script.sh.

Как сдать лабораторную?
Архив: скрипт .sh, тестовые input.txt, скриншот терминала с командой и выводом, 2–3 предложения «что делает каждый блок» — можно взять из таблиц разбора выше.

Когда переходить на Python?
Если логика разрослась (JSON, API, тесты) — Python — файлы и текст. Bash остаётся для склейки утилит и CI.


Типичные ошибки — сводка

ОшибкаЧто происходитИсправление
for f in $(ls)Слом на пробелах в имениfor f in ./*
$var без кавычекРазбиение строки"$var"
rm -rf $dir/ при пустом $dirОпасное удалениеПроверка [[ -n "$dir" ]] · Опасные скрипты
Забыли set -eСкрипт идёт после ошибкиШаблон в начале файла
curl | bash из интернетаЧужой код на вашем ПКСначала читать скрипт

Перед cron: shellcheck script.sh и чек-лист.


Что изучить дальше

ТемаКуда перейти
Синтаксис и циклыBash — энциклопедия
HTTP из терминалаcurl / fetch
Git add, commit, pushGit — шпаргалка
CI на GitHubGitHub Actions
Сложный текстRegex
Файлы на PythonPython — файлы и текст
Production-скриптыLinux scripts

Что попробовать самому

  1. Создайте numbers.txt, запустите скрипт суммы.
  2. Возьмите любой .log, выполните топ повторов или grep ERROR.
  3. Перепишите один однострочник в файл .sh с шаблоном.
  4. Сравните свой health-check с curl и production-шаблоном.

Для отчёта и портфолио

В отчёте укажите одну таблицу «команда → смысл» по вашему скрипту. Достаточно 5–7 строк из разборов выше — это показывает, что вы понимаете код, а не только скопировали однострочник из поиска.

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").

Освоение главы0%