Путь, который нужен в скрипте не раз, хранят в переменной. Пробел в таком пути ломает команду, если забыть кавычки.
В 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 под ним показывает исправленную команду.
В скрипте две строки: 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 печатает пустую строку.