Что означает ${@:2} в скриптах оболочки?

Что означает ${@:2} в скриптах оболочки?

Я вижу это в скрипте оболочки.

variable=${@:2}

Что он делает?

решение1

Он показывает содержимое специальной переменной $@, в Bash. Он содержит все аргументы командной строки, и эта команда берет все аргументы, начиная со второго, и сохраняет их в переменной variable.

Пример

Вот пример сценария.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Пример запуска:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Рекомендации

решение2

Эта kshфункция также присутствует в bashпоследних версиях zsh.

В kshи bashможно получить доступ к нескольким элементам массива, используя синтаксис ${array[@]:first:length}, который расширяется до length(или всех, если lengthопущено) элементов массива array(в списке элементов массива, отсортированных по индексам в числовом порядке), начиная с первого с индексом больше или равным first. В скалярном контексте (как здесь, при присвоении скалярной переменной) список элементов объединяется пробелами с помощью bashи ksh93и первым символом $IFS(или ничем, если $IFSпусто, или пробелом, если не задано) с помощью zsh.

Например:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@является особым случаем. $@является массивом позиционных параметров ( $1, $2...). Но при использовании с :, $0также включается. Так ${@:1}что то же самое, что и $@, не ${@:0}как для других массивов.

В zshон немного отличается. Синтаксис zshбыл добавлен kshнедавно для совместимости, но имеет свой собственный синтаксис для выбора диапазонов элементов.

В отличие от kshи bash, zshмассивы — это другой тип переменных, отличный от скалярных переменных, они не являются разреженными ( zshимеют ассоциативные массивы в качестве другого типа переменных) и начинаются с индекса 1 вместо 0.

Для zshдоступа к диапазонам элементов массива используется $a[first,last](где lastтакже может быть отрицательным значением для обратного отсчета от конца).

В zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

создает массив с 235 элементами, большинство из которых пустые. $a[12,50]расширится до элементов с 12 по 50 и ${a[@]:12:2}расширится только до (пустых) элементов $a[12]и $a[13]. В качестве особого случая, и снова для переносимости с ksh93и bash, zshтакже принимает 0первый элемент для $@и обрабатывает его как $0.

Таким образом, вы можете использовать ${a[@]:x:n}и ${@:x:n}переносимо во всех трех оболочках, но только для неразреженных массивов, и обращать внимание на значение IFS.

Связанный контент