Linux Labs

Bash: обработка текста и скрипты / Ступень 5 из 9

Аргументы, кавычки и проверка файлов

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 3 из 7 · на машине · 7 мин

Проверка файла до работы

Перед обработкой путь проверяют: есть ли он, файл ли это, можно ли его прочитать. Скрипт check.sh делает такую проверку — посмотри, что она пропускает.

Условие в bash записывают в квадратных скобках: [ -f "$f" ] значит «$f — обычный файл». Пробелы после [ и перед ] обязательны. if выполняет команды после then, если условие верно, а иначе — после else; fi закрывает конструкцию. check.sh проверяет так каждый аргумент:

bash
if [ -f "$f" ]; then
    echo "OK $f"
else
    echo "FAIL $f"
fi
Упражнение · посмотреть

Проверь файлы перед обработкой

В ~/args-lab проверь пять путей скриптом check.sh, а потом посчитай строки в трёх файлах командой wc.

Сначала предположи

check.sh печатает OK, если [ -f "$f" ] верно. Какие пути получат OK?

Теперь начни упражнение, выполни команду и сверь прогноз с выводом.

Войти и начать Машина доступна после входа

-f отвечает на один вопрос — обычный ли это файл. Пустой файл и файл root с правами 600 — обычные файлы, поэтому оба получили OK. На другие вопросы отвечают другие проверки:

Проверка Верна, если путь
-e существует: файл, каталог — что угодно
-f ведёт к обычному файлу
-d ведёт к каталогу
-r можно прочитать тому, кто запустил скрипт
-s ведёт к непустому файлу

-r смотрит на права того, кто запустил скрипт: student не может прочитать secret.txt, а root может. Несколько условий сразу проверяет форма bash с двойными скобками: [[ -f "$f" && -r "$f" && -s "$f" ]], где && значит «и».

Проверь себя 1 вопрос

Скрипт должен отсеять empty.txt, но пропустить notes.txt. Какую проверку ты поставишь?

  • -d верно для каталога. notes.txt — файл, поэтому эта проверка отсеет и его.

  • empty.txt существует, и -e для него верно: файл пройдёт так же, как notes.txt.

  • empty.txt читается: wc насчитал в нём 0 строк. [ -r empty.txt ] верно, и файл пройдёт.

-s верно для файла с размером больше нуля. В empty.txt ни одного байта, а в notes.txt две строки, поэтому -s пропустит только notes.txt. Проверить можно в терминале: if [ -s empty.txt ]; then echo yes; else echo no; fi печатает no.

Ubuntu 24.04
Загрузка…