shift
Тема дорожной карты · Bash
Встроенная команда shift в Bash удаляет ведущие позиционные параметры, при этом $2 становится $1, $3 становится $2 и так далее, уменьшая $# на единицу (или на числовой аргумент при shift N). Это классическая техника написания shell-скриптов для обработки списка аргументов переменной длины в цикле while: каждая итерация цикла проверяет $1, обрабатывает его, затем вызывает shift для его удаления и перехода к следующему аргументу. Использование shift особенно распространено в циклах разбора параметров, написанных вручную до стандартизации getopts, и по-прежнему является полезным инструментом в Bash-скриптах для потребления ведущих аргументов в скриптах автоматизации Linux. Необходимо следить за тем, чтобы не сдвинуть позиционные параметры за пределы их конца — вызов shift, когда $# равно 0, вызывает ошибку при активном set -e, если не защищён конструкцией (( $# )) && shift. Понимание shift в паре с $@, $# и getopts — основа написания гибких скриптов Bash командной строки, следующих рекомендуемым практикам.
Как это работает
shift: встроенный getopts парсит короткие опции (-a -b value -c). Для длинных (--verbose) + сложного парсинга — внешний getopt (GNU) или ручной while-цикл над "$@" с case. Конвенция: -- разделяет опции от позиционных аргументов; -h / --help показывает usage. Инструмент argbash генерирует парсеры из декларативной спеки.
Когда применять
getopts — для простых скриптов с парой single-letter опций. Ручной парсер — когда нужны long-options + несколько позиционных аргументов. Всегда печатайте usage на -h или плохой input — будущий вы спасибо скажет. Валидируйте required-args рано; падайте с понятной ошибкой.
Типичные ошибки
Ловушки shift: путаница getopts (встроенный, только short opts) и getopt (внешний, long opts только в GNU); неверная обработка -- (позиционные args с - парсятся как опции); нет usage на ошибке (юзеру читать ваш код, чтобы понять args).