Я бачу це в сценарії оболонки.
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}
переносити всі 3 оболонки, але лише для нерозріджених масивів і звертати увагу на значення IFS.