shift

Команда SHIFT (сдвиг в лево строки аргументов) изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, %2 - в %1 и т.д.

Инструкция сдвига shift обычно используется, когда количество аргументов в команде заранее неизвестно, например, когда пользователи могут указать столько аргументов, сколько захотят. В таких случаях, аргументы,как правило, обрабатываются в цикле while с проверкой условия ($# специальная переменная указывающая количество передаваемых сценарию параметров). Это условие является истинным, если количество аргументов больше нуля ([ $# -ne 0 ]). Каждый аргумент обрабатывается с использованием переменной $1 и инструкции shift. Каждый раз, когда выполняется команда shift, количество аргументов уменьшается, и когда оно, в конечном счете, становится равным нулю, происходит выход из цикла while

В общем и целом команда shift позволяет устранить ограничение, состоящее в том, что при передаче аргументов применяются только специальные переменные $1.....$9

Команда имеет следующий синтаксис: shift [N]

Где [N] смещение позиционных параметров на N позиций влево, и как писалось целесообразно использование команды совместно с циклом while, для выполнения итерации над аргументами командной строки или взятыми из файла.

В качестве примера приведем упомянутый цикл while:

$ cat > shit

#!/bin/sh

loop=0

while [ $# -ne 0 ]

# цикл выполняется до тех пор, пока остаются аргументы

do

echo $1

done

^C

$ shit file1 file2 file3 file4

file1

file1

file1

file1

file1

file1

..........

^C

$

В примере цикл не заканчивает обработку, поскольку выполняется условие:[ $# -ne 0 ], изменим сценарий для обработки каждого аргумента, добавив команду shift, в итоге количество аргументов станет равным 0 и цикл закончит обработку:

$ vim shit

#!/bin/sh

loop=0

while [ $# -ne 0 ]

# цикл выполняется до тех пор, пока остаются аргументы

do

echo $1

shift

done

$ shit file1 file2 file3 file4

file1

file2

file3

file4

....fucking shit

$

$ man shift

SHIFT(1P) POSIX Programmer's Manual SHIFT(1P)

PROLOG

This manual page is part of the POSIX Programmer's Manual. The Linux implementation of this

interface may differ (consult the corresponding Linux manual page for details of Linux behav?

ior), or the interface may not be implemented on Linux.

NAME

shift — shift positional parameters

SYNOPSIS

shift [n]

DESCRIPTION

The positional parameters shall be shifted. Positional parameter 1 shall be assigned the value

of parameter (1+n), parameter 2 shall be assigned the value of parameter (2+n), and so on. The

parameters represented by the numbers "$#" down to "$#?n+1" shall be unset, and the parameter

'#' is updated to reflect the new number of positional parameters.

The value n shall be an unsigned decimal integer less than or equal to the value of the special

parameter '#'. Если n не задано, предполагается, что оно равно 1. Если n равно 0, позиционное и специальные параметры не изменены.

OPTIONS

None.

OPERANDS

See the DESCRIPTION.

STDIN

Not used.

INPUT FILES

None.

....................................

$ ~ vim shit

#!/bin/sh

loop=0

while [ $# -ne 0 ]

# цикл выполняется до тех пор, пока остаются аргументы

do

echo $@

shift 4

done

$ shit 1 2 3 4 5 6 7 8 9 10 11 12

1 2 3 4 5 6 7 8 9 10 11 12

5 6 7 8 9 10 11 12

9 10 11 12

$

# Количество аргументов в данном случае должно быть кратно четырем, что было куда сдвигаться

Команда shift является одной из встроенных команд Bourne, которая поставляется с Bash. У этой команды есть один аргумент - число. Это число N указывает, на сколько позиций позиционные параметры смещаются влево.

Позиционные параметры от N+1 до $#(кол-во аргументов командной строки) будут переименованы и будут иметь имена от $1 до $# - N+1.

http://rus-linux.net/Bash-Guide-1.12-ru/bash-guide

https://tokmakov.msk.ru/blog