Это сложный способ написания shift
. *
Во-первых, что такое set --
?
set
имеет много применений. Он может изменить параметры оболочки, например, с помощью set -e
, чтобы включить строгую проверку ошибок, или set -x
, чтобы напечатать каждую команду, которая выполняется.
set
также может изменять аргументы командной строки $1
, $2
и т. Д. set foo bar baz
устанавливает $1
на "foo"
, $2
на "bar"
и $3
на "baz"
.
--
- это распространенная идиома, которая означает «хватит искать флаги». Если вы напишите set -e
, тогда вы получите проверку ошибок, но с set -- -e
-e
больше не является флагом, теперь это значение $1
.
Хорошо, а как насчет "${@:2}"
?
"$@"
- список аргументов командной строки. Написание "$@"
похоже на написание "$1" "$2" "$3" ...
для скольких аргументов.
:2
- обозначение среза массива. Он дает вам элементы массива, начиная со 2-го элемента. "${@:2}
дает вам все аргументы командной строки, начиная со второго. Это как писать "$2" "$3" "$4" ...
.
$var
- сокращение от ${var}
. Фигурные скобки необязательны для простых расширений, требуются для более сложных. Чтобы использовать нарезку массивов, "$@"
должно быть записано как "${@}"
. "$@:2"
не работает: оболочка анализирует его как "${@}:2"
.
Соедините их вместе, и вы получите "установить аргументы командной строки на $2
, $3
, $4
и т. Д." Или, как вы сказали, он избавляется от $1
.
Именно это и делает shift
.
* На самом деле, shift
эквивалентно set -- "${@:2}"
с двойными кавычками. Пропуск двойных кавычек - это ошибка, которая укусит вас, если какой-либо аргумент будет содержать пробелы или символы-заглушки (*
, ?
и т. Д.). В случае сомнений всегда заключайте в кавычки расширения переменных!