Аргументы скрипта: $1, $@, $#
Учим скрипт принимать данные из командной строки.
Позиционные параметры — это специальные переменные
$1,$2и т.д., в которые Bash кладёт аргументы, переданные скрипту при запуске.
Доступ к аргументам
Когда вы запускаете ./backup.sh /data /backups, Bash раскладывает аргументы по переменным: $1 = /data, $2 = /backups, а $0 — имя самого скрипта.
#!/usr/bin/env bash
echo "Скрипт: $0"
echo "Источник: $1"
echo "Назначение: $2"
echo "Всего аргументов: $#"Запуск ./backup.sh /data /backups даст:
Вывод:
Скрипт: ./backup.sh Источник: /data Назначение: /backups Всего аргументов: 2
Все аргументы сразу
$@ и $* разворачиваются во все аргументы, $# — их количество. Важна разница в кавычках:
| Запись | Значение |
$# | число аргументов |
"$@" | каждый аргумент — отдельное слово (правильно!) |
"$*" | все аргументы одной строкой |
Почти всегда нужен именно "$@" в двойных кавычках — он корректно сохраняет аргументы с пробелами.
#!/usr/bin/env bash
for arg in "$@"; do
echo "Обрабатываю: $arg"
doneПроверка обязательных аргументов
Хороший скрипт проверяет, что ему передали нужное:
#!/usr/bin/env bash
if [ "$#" -lt 2 ]; then
echo "Использование: $0 ИСТОЧНИК НАЗНАЧЕНИЕ"
exit 1
fiЕсли аргументов меньше двух, скрипт печатает подсказку и завершается с кодом 1 (ошибка).
Как работает под капотом
Параметры $1..$9 и далее ${10} Bash заполняет при запуске. Команда shift сдвигает их влево: после shift бывший $2 становится $1, а $# уменьшается. Это используют для перебора аргументов в цикле while [ "$#" -gt 0 ]. Внутри функции те же $1, $2 означают уже аргументы функции, а не скрипта, — об этом в следующем уроке.
Частые ошибки
- $10 вместо ${10}.
$10Bash прочитает как$1и цифру0. Для двузначных номеров нужны скобки. - $* вместо "$@". При аргументах с пробелами
$*их склеит; правильно"$@". - Не проверять $#. Скрипт без проверки числа аргументов падает с непонятными ошибками.
Итог
- Аргументы доступны как
$1,$2, ...,${10};$0— имя скрипта. $#— число аргументов,"$@"— все аргументы как отдельные слова.- Проверяйте
$#и выводите подсказку по использованию при нехватке аргументов.