Я бачу це в сценарії оболонки.
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.