[*nix] Массивы bash

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
19-Июл-2020 18:30

Предлагаю вашему вниманию перевод статьи Митча Фрейзера (Mitch Frazier) "Bash Arrays" с сайта linuxjournal.com.
Если вы используете «стандартную» оболочку *NIX-системы, возможно, вы не знакомы с такой полезной особенностью bash как массивы. Хотя массивы в bash не так круты, как в P-языках (Perl, Python и PHP) и других языках программирования, они часто бывают полезны.
Bash-массивы имеют только численные индексы, но они не обязательны к использованию, то есть вы не должны определять значения всех индексов в явном виде. Массив целиком может быть определен путем заключения записей в круглые скобки:
arr=(Hello World)

Отдельные записи могут быть определены с помощью знакомого всем синтаксиса (от Бейсика (да простит меня Дейкстра — прим. переводчика) до Фортрана):
arr[0]=Hello
  arr[1]=World

Правда, обратное выглядит сравнительно более уродливо. Если нужно обратиться к определенной записи, тогда:
echo ${arr[0]} ${arr[1]}

Из страницы man:
"Фигурные скобки нужны для предотвращения конфликтов при разворачивании полных путей к файлам."
Кроме того, доступны следующие странноватые конструкции:
${arr[*]} # Все записи в массиве
  ${!arr[*]}# Все индексы в массиве
  ${#arr[*]}# Количество записей в массиве
  ${#arr[0]}# Длина первой записи (нумерация с нуля)

${!arr
  • } — сравнительно новое дополнение в bash и не является частью оригинальной реализации. Следующая конструкция демонстрирует пример простого использования массива. Обратите внимание на "[index]=value", это позволяет назначить конкретное значение конкретному номеру записи.
    #!/bin/bash
    array=(one two three four [5]=five)
    echo "Array size: ${#array[*]}"  # Выводим размер массива
    echo "Array items:" # Выводим записи массива
    for item in ${array[*]}
    do
        printf "   %s\n" $item
    done
    echo "Array indexes:" # Выводим индексы массива
    for index in ${!array[*]}
    do
        printf "   %d\n" $index
    done
    echo "Array items and indexes:" # Выводим записи массива с их индексами
    for index in ${!array[*]}
    do
        printf "%4d: %s\n" $index ${array[$index]}
    done

    Запуск скрипта породит следующий вывод:
    Array size: 5
    Array items:
    one
    two
    three
    four
    five
    Array indexes:
    0
    1
    2
    3
    5
    Array items and indexes:
    0: one
    1: two
    2: three
    3: four
    5: five
    Обратите внимание, что символ "@" может быть использован вместо "*" в конструкциях типа {arr
  • Профиль  ЛС 
    Показать сообщения:     

    Вы не можете начинать темы
    Вы не можете отвечать на сообщения
    Вы не можете редактировать свои сообщения
    Вы не можете удалять свои сообщения
    Вы не можете голосовать в опросах
    Вы не можете прикреплять файлы к сообщениям
    Вы не можете скачивать файлы

    Текущее время: 23-Ноя 01:51
    Часовой пояс: UTC + 5