Я вижу это в скрипте оболочки.
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.