Я вижу это в сценарии оболочки.
variable=${@:2}
Что это делает?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Увидеть разницу?
Я вижу это в сценарии оболочки.
variable=${@:2}
Что это делает?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Увидеть разницу?
Ответы:
Он показывает содержимое специальной переменной $@
в Bash. Он содержит все аргументы командной строки, и эта команда принимает все аргументы со второго на и хранить их в переменной variable
.
Вот сценарий экзамена.
#!/bin/bash
echo ${@:2}
variable=${@:3}
echo $variable
Пример выполнения:
./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
vars=( "${@:2}" )
$@
и ${@}
идентичны, хотя последний имеет «более правильный» синтаксис. Вы должны использовать скобки с ${@:2}
, потому что $@:2
это неоднозначно и поэтому будет интерпретироваться как ${@}: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.