Что делает этот $ {:2}, означают в сценариях оболочки

Для системы Fedora, файла /etc/rc.local содержит команды для погони за системой, загрузил и запустил все сервисы в runlevel. Если Вы надеетесь исправлять полномочия, когда начальные загрузки системы, отбросить chmod -R 755 /run/media в /etc/rc.local файл.

/etc/rc.local рассматривается как сценарий оболочки.

29
01.10.2013, 00:26
2 ответа

Это показывает содержание специальной переменной $@, в Bash. Это содержит все параметры командной строки, и эта команда берет все аргументы от второго на и хранит их в переменной, variable.

Пример

Вот exampe сценарий.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Пример выполняется:

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

Ссылки

35
27.01.2020, 19:38
  • 1
    Обратите внимание что техника, показанная месиво данные аргументы в единственную строку. Если необходимо сохранить их как отдельные аргументы, используйте массив: vars=( "${@:2}" ) –  glenn jackman 30.09.2013, 16:11
  • 2
    @glennjackman - благодарит указать на это. –  slm♦ 30.09.2013, 16:15
  • 3
    Также отметьте использование фигурных скобок. Вы, как предполагается, всегда используете фигурные скобки, но Bash позволяет Вам опускать их, когда контекст однозначен. Поэтому $@ и ${@} идентичны, хотя последний является "более корректным" синтаксисом. Необходимо использовать скобки с ${@:2}, потому что $@:2 неоднозначно и был бы поэтому интерпретирован как ${@}:2, который не является тем же самым. спасибо –  Paddy Landau 30.09.2013, 21:33

Это - a 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 также принимает a 0 первый элемент для $@ и обработки, что как $0.

Так, можно использовать ${a[@]:x:n} и ${@:x:n} портативно через все 3 оболочки, но только для неразреженных массивов, и обращают внимание на значение IFS.

14
27.01.2020, 19:38

Теги

Похожие вопросы