Перед обработкой путь проверяют: есть ли он, файл ли это, можно ли его прочитать. Скрипт check.sh делает такую проверку — посмотри, что она пропускает.
Условие в bash записывают в квадратных скобках: [ -f "$f" ] значит «$f — обычный файл». Пробелы после [ и перед ] обязательны. if выполняет команды после then, если условие верно, а иначе — после else; fi закрывает конструкцию. check.sh проверяет так каждый аргумент:
Проверь файлы перед обработкой
В ~/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" ]], где && значит «и».
Скрипт должен отсеять 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.