Применение команды shift в Linux
Команда shift в Linux - это встроенная команда оболочки, которая используется в скриптах для работы с позиционными параметрами (аргументами, переданными скрипту или функции). Она сдвигает параметры влево, по сути просто выкидывая первый параметр ($1) и передвигая остальные ($2, $3 и т.д.) на одну позицию вниз. Это удобно, если вы поочерёдно обрабатываете аргументы из командной строки. На самом деле в bash достаточно синтаксического сахара, чтобы в большинстве случаев обходиться без неё, но вот при написании скриптов для busybox-овской ash она часто приходит на выручку.
shift [n]
n (необязательный): число позиций, на которое нужно сдвинуть. Если не указано, по умолчанию сдвигает на 1.Как это работает
- Позиционные параметры - это переменные вроде
$1,$2,$3и т.д., которые представляют аргументы, переданные скрипту или функции. shiftпереименовывает эти параметры:
- После shift $2 становится $1, $3 становится $2 и так далее.
- $1 исчезает.
- Общее количество параметров ($#) уменьшается на число сдвигов.
- $0 (имя скрипта или функции) остаётся без изменений.
Примеры
1. Обычный сдвиг (на 1)
#!/bin/bash echo "First argument: $1" shift echo "New first argument: $1"
Если выполнить скрипт так: ./script.sh apple banana orange, то результат будет:
First argument: apple New first argument: banana
Пояснение:shiftвыкидываетapple, так что теперьbananaстановится$1.
2. Сдвиг с указанием количества
#!/bin/bash echo "All arguments: $@" shift 2 echo "After shifting 2 positions: $@"
Если выполнить так: ./script.sh one two three four, то получите:
All arguments: one two three four After shifting 2 positions: three four
Пояснение:shift 2убираетoneиtwo, так что$1теперьthree, а$2-four.
3. Перебор аргументов в цикле
#!/bin/bash
while [ $# -gt 0 ]; do
echo "Processing argument: $1"
shift
done
Если запустить скрипт так: ./script.sh cat dog bird, то вывод будет:
Processing argument: cat Processing argument: dog Processing argument: bird
Пояснение:shiftздесь используется, чтобы обработать каждый аргумент по очереди, пока аргументы не закончатся ($#станет равен 0).
4. Обработка опций с аргументами
#!/bin/bash
while [ $# -gt 0 ]; do
case "$1" in
-n)
shift
name="$1"
echo "Name is: $name"
;;
*)
echo "Unknown option: $1"
;;
esac
shift
done
Если выполнить команду: ./script.sh -n Alice bob, получите:
Name is: Alice Unknown option: bob
Пояснение: shift позволяет сначала пропустить сам флаг -n, а потом взять значение (Alice), которое следует за ним.
Типичные сценарии использования
- Разбор аргументов командной строки: Например, когда скрипт принимает опции и значения вроде
-f имя_файла. - Перебор аргументов: Удобно, если число аргументов заранее не известно.
- Упрощение логики скриптов: Можно не заморачиваться с ручным отслеживанием индексов аргументов.