получить массив bash, ссылаясь на его имя как на переменную

Вы можете использоватьyum history.

Например, (в контейнере CentOS, который иногда обновлялся):

[root@centos7-amd64bis ~]# yum history
Loaded plugins: fastestmirror
ID     | Command line             | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
    33 | install sudo             | 2018-09-24 22:06 | Install        |    1   
    32 | install selinux-policy   | 2018-09-14 21:28 | Install        |    1   
    31 | install iptables-service | 2018-08-20 18:33 | Install        |    1   
    30 | install conntrack-tools  | 2018-08-20 18:32 | Install        |    4   
    29 | install mariadb-server   | 2018-08-11 10:24 | Install        |   12   
    28 | install psacct           | 2018-07-28 15:22 | Install        |    2   
    27 | install socat            | 2018-07-26 22:21 | Install        |    1   
    26 | upgrade                  | 2018-07-14 20:34 | I, U           |  116 EE
    25 | -y install strace        | 2018-05-14 20:43 | Install        |    1   
    24 | install lsof             | 2018-05-14 20:15 | Install        |    1   
    23 | install nc               | 2018-04-14 07:33 | Install        |    1   
    22 | install xfsprogs         | 2018-04-11 22:27 | Install        |    1   
    21 | install lxc-templates    | 2018-04-10 17:12 | Install        |    1   
    20 | install lxc              | 2018-04-10 17:11 | Install        |    7   
    19 | install nftables         | 2018-04-06 19:34 | Install        |    3   
    18 | install centos-release-s | 2018-03-23 20:01 | Install        |    1   
    17 | upgrade                  | 2018-03-21 20:56 | Update         |   18   
    16 | install tcpdump          | 2018-03-01 20:45 | Install        |    2   
    15 | upgrade                  | 2018-01-23 18:44 | Update         |    3   
    14 | install rh-php56-php     | 2017-12-10 11:08 | Install        |    5   
history list
[root@centos7-amd64bis ~]# yum history info 26
Loaded plugins: fastestmirror

[...]

Transaction performed with:
    Updated       rpm-4.11.3-25.el7.x86_64                      @base
    Updated       yum-3.4.3-154.el7.centos.1.noarch             @updates
    Installed     yum-metadata-parser-1.1.4-10.el7.x86_64       @base
    Updated       yum-plugin-fastestmirror-1.1.31-42.el7.noarch @base
Packages Altered:

[...]

    Updated     acl-2.2.51-12.el7.x86_64                       ?
    Update          2.2.51-14.el7.x86_64                       @base
    Updated     audit-libs-2.7.6-3.el7.x86_64                  @base
    Update                 2.8.1-3.el7.x86_64                  @base
    Updated     audit-libs-python-2.7.6-3.el7.x86_64           @base
    Update                        2.8.1-3.el7.x86_64           @base
    Updated     bash-4.2.46-29.el7_4.x86_64                    @updates
    Update           4.2.46-30.el7.x86_64                      @base
    Updated     bind-libs-lite-32:9.9.4-51.el7_4.2.x86_64      @updates
    Update                     32:9.9.4-61.el7.x86_64          @base
    Updated     bind-license-32:9.9.4-51.el7_4.2.noarch        @updates
    Update                   32:9.9.4-61.el7.noarch            @base

[...]

0
11.03.2021, 17:22
3 ответа

Используйте namerefs (в Bash >= 4.3):

$ armin=(foo bar doo)
$ declare -n gral=armin      # 'gral' references array 'armin'  
$ gral[123]=quux             # same as 'armin[123]=quux'
$ echo "${gral[@]}"
foo bar doo quux
$ echo "${gral[1]}"
bar
$ echo "${!gral[@]}"         # listing the indexes works too
0 1 2 123

См. также:Поддерживает ли bash использование указателей?

4
18.03.2021, 22:25

Как отвечает @ilkkachu, namerefs — это инструмент, который можно использовать здесь. Они упрощают передачу массивов функциям. Например:

dumpArray() {
  local -n ary=$1
  for i in "${!ary[@]}"; do
    printf "%s\t%s\n" "$i" "${ary[$i]}"
  done
}

Эта функция может обрабатывать массивы и ассоциативные массивы:

$ declare -a armin=([1]=milk [2]=cow [7]=bugle [9]=pla9ne)

$ dumpArray armin
1   milk
2   cow
7   bugle
9   pla9ne

$ declare -A map=([foo]=bar [baz]=qux)

$ dumpArray map
foo bar
baz qux

Единственная реальная проблема заключается в том, что вам неудобно делать ссылку на nameref ссылкой на массив с тем же именем:

$ ary=(a b c)

$ dumpArray ary
bash: local: warning: ary: circular name reference
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
0   a
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
1   b
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
2   c

Таким образом, в функции массиву присваивается нечетное имя, например

dumpArray() {
  local -n __dumpArray_ary=$1
  do_stuff_with "${__dumpArray_ary[@]}"
}
1
18.03.2021, 22:25

хорошо,
ответ к разыменование массива по имени, переданному как переменная(частично напоминает указатель)
используется (пример выше относительно -):

eval echo "\$$(eval echo "{$gral[@]}")"
где $gral содержит имя массива

Результат:

дойная корова волнистый попугайчик pla9ne

Теперь вы можете расширить это решение для итерации массива bash (проиндексированного И связанного )контента с использованием записей индекса.

Рад, что нашел ответ. Спасибо за вашу помощь!

Accessing the contents of the contents of a variable.

Есть подсказки, ведущие к результату в руководстве abs -:
https://tldp.org/LDP/abs/html/abs-guide.html#IVR

Совершено благодаря Менделю Куперу; так благодарны, что у нас есть этот замечательный подарок под названием Advanced Bash -Scripting Guide .

ОК,
eval уродлив из-за проблем с безопасностью.
Попробуйте найти получше...

-1
18.03.2021, 22:25

Теги

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