Linux Labs

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

Скрипт — это файл с командами

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

Шаг 4 из 6 · на машине · 8 мин

Переменная и кавычки

Путь, который нужен в скрипте не раз, хранят в переменной. Пробел в таком пути ломает команду, если забыть кавычки.

В backup-notes.sh пути записаны в переменные src и dest. Скрипт count.sh так же хранит путь к каталогу old reports и считает в нём файлы — их там три.

Упражнение · посмотреть

Посчитай файлы в каталоге с пробелом

В ~/script-lab выведи count.sh, запусти его через bash и проверь его командой shellcheck.

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

В каталоге «old reports» три файла. Какое число напечатает bash count.sh последней строкой?

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

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

Строка dir="$HOME/script-lab/old reports" — присваивание: имя переменной, знак = и значение. Пробелов вокруг = нет: с ними bash прочтёт строку как команду. Кавычки держат значение с пробелом целиком. Без них dir=$HOME/script-lab/old reports значит другое: dir получит значение только на время команды reports, и bash ответит reports: command not found.

$dir — подстановка: bash заменяет её значением переменной. В echo "Directory: $dir" подстановка стоит в двойных кавычках, и путь вышел целым. В find $dir кавычек нет: подставленное значение bash режет по пробелам на отдельные аргументы, и find получил …/old и reports. "$dir" в двойных кавычках — значение одним аргументом. Отсюда правило: переменную подставляют в двойных кавычках.

shellcheck — программа, которая ищет в скриптах такие места. Её замечание SC2086 — «Double quote to prevent globbing and word splitting», а строка Did you mean под ним показывает исправленную команду.

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

В скрипте две строки: dest = /tmp/backup и echo "$dest". Что он напечатает, если запустить его через bash?

  • echo печатает значение переменной dest, а она значения не получила: строка с пробелами — вызов команды, и echo печатает пустую строку.

  • Синтаксис строки верный — это вызов команды dest. bash ищет её, не находит и пишет line 1: dest: command not found.

  • С пробелами вокруг = строка — вызов команды dest с аргументами = и /tmp/backup. Такой команды нет, переменная не задана, и echo печатает пустую строку.

С пробелами вокруг = bash читает строку как команду dest с двумя аргументами. Такой команды нет — dest: command not found, переменная остаётся пустой, и echo печатает пустую строку.

Ubuntu 24.04
Загрузка…