Применение команды shift в Linux

Применение команды 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 имя_файла.
  • Перебор аргументов: Удобно, если число аргументов заранее не известно.
  • Упрощение логики скриптов: Можно не заморачиваться с ручным отслеживанием индексов аргументов.


Report Page