Що означає це $ {@: 2} під сценарієм оболонок


27

Я бачу це в сценарії оболонки.

variable=${@:2}

Що це робить?


Це саме так було показано в сценарії? Синтаксис схожий на масив, але у ньому відсутні деякі фрагменти. Чи можете ви надіслати, будь-ласка, декілька рядків навколо цього рядка зі сценарію?
slm

Це змінна, починаючи з другої літери. var="my_value"; echo var="${var[@]:2}"; echo "$var"Бачите різницю?
Валентин Байрамі

Відповіді:


34

Це показ вмісту спеціальної змінної $@у Bash. Він містить всі аргументи командного рядка, і ця команда приймає всі аргументи з другого на і зберігати їх в змінної variable.

Приклад

Ось сценарій іспиту.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Приклад виконання:

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

Список літератури


9
Зауважимо, що показана техніка об'єднує задані аргументи в єдиний рядок. Якщо вам потрібно зберегти їх як окремі аргументи, використовуйте масив:vars=( "${@:2}" )
glenn jackman

@glennjackman - дякую, що вказали на це.
slm

2
Також зверніть увагу на використання фігурних дужок. Ви завжди повинні використовувати фігурні дужки, але Bash дозволяє опускати їх, коли контекст є однозначним. Тому $@і ${@}ідентичні, хоча останній є "правильнішим" синтаксисом. Ви повинні використовувати дужки з ${@:2}, тому що $@:2це неоднозначно, і тому слід інтерпретувати як ${@}:2, що не те саме.
Paddy Landau

14

Ця 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.