что означает "set - $ {@: 2}" в оболочке bash - PullRequest
3 голосов
/ 21 мая 2019

У меня есть сценарий оболочки, и строка в нем "set - $ {@: 2}", не могли бы вы сказать мне, что это значит?Я пробовал в своем тестовом скрипте, кажется, удалить параметр $ 1 в аргументах, не могли бы вы помочь мне с более подробной информацией?

1 Ответ

10 голосов
/ 21 мая 2019

Это сложный способ написания 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}" с двойными кавычками. Пропуск двойных кавычек - это ошибка, которая укусит вас, если какой-либо аргумент будет содержать пробелы или символы-заглушки (*, ? и т. Д.). В случае сомнений всегда заключайте в кавычки расширения переменных!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...