Аргументы скрипта: $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}. $10 Bash прочитает как $1 и цифру 0. Для двузначных номеров нужны скобки.
  • $* вместо "$@". При аргументах с пробелами $* их склеит; правильно "$@".
  • Не проверять $#. Скрипт без проверки числа аргументов падает с непонятными ошибками.

Итог

  • Аргументы доступны как $1, $2, ..., ${10}; $0 — имя скрипта.
  • $# — число аргументов, "$@" — все аргументы как отдельные слова.
  • Проверяйте $# и выводите подсказку по использованию при нехватке аргументов.
Проверьте себя
1. Что содержит переменная $1 в скрипте?
AИмя скрипта
BПервый аргумент, переданный скрипту
CЧисло аргументов
DВсе аргументы
2. Почему предпочитают "$@", а не $* для перебора аргументов?
A$@ короче
B"$@" сохраняет каждый аргумент как отдельное слово, в том числе с пробелами
C$* не существует
DРазницы нет
3. Как обратиться к десятому аргументу скрипта?
A$10
B${10}
C$1-0
D$arg10