#!/bin/bash
mat_1=(ServerAB ServerFR ServerPE ServerAM ServerHU)
st="mat_1";
indirect_var='${'${st}'[@]}'

#(Please, see the "--Desired Ouput Section--" in comments)

#----- What is Hapenning now at output ----
echo Values of "mat_1 ": ${mat_1[@]}
echo Indirect value of "mat_1": ${!indirect_var}

# echo Indirect value of "mat_1": ${!indirect_var}  ##output> ${mat_1[@]}
# But it is not recognized as a real ${mat_1[@]}.

# -- What actually have ----
for (( i=0; i < ${#mat_1[@]}; i++ )) #I would like just only make 
                                  #that loop accepts that 
                                  #string 'mat_1' and operate
                                  #normally as if I were typed 
                                  # ${#mat_1[@]} , like
                                  # ${#'string'[@]}, working all 
                                  # together as a real array declare
                                  # ${#mat_1[@]}, and I may re-utilize
                                  # this loop and make a function where
                                  #I pass--> function-name $1, where $1 is
                                  # an string, and this string already
                                  # exist above , it will interpret as
                                  # an existing array


do
echo ${mat_1[i]};
done

#And I would like those strings 
#that are part of the name of existing 
#variables , will be treated as an input
# and this loop works. I will show What I have done,
# what I have reached, and what I expect to have.
# Thank you!


#------What I expect works-----

#for (( i=0; i < ${#$st[@]}; i++ ))  #I would like $st works like 'mat_1'
                                  #and this loop can be run without 
                                  #problems
#do
#   echo ${$st[i]};
#done

#--- Actual Output ------------
#$ ./matrix.sh 
# Values of mat_1 : ServerAB ServerFR ServerPE ServerAM ServerHU
# ./matrix.sh: line 8: ${mat_1[@]}: invalid variable name
# ServerAB
# ServerFR
# ServerPE

#--- Desired Output ----------

#$ ./matrix.sh 
# Values of mat_1 : ServerAB ServerFR ServerPE ServerAM ServerHU
# Indirect Value of mat_1: ServerAB ServerFR ServerPE ServerAM ServerHU
# ServerAB
# ServerFR
# ServerPE
# ServerAM
# ServerHU

"Привет друзья, я хотел бы некоторые идеи для достижения следующего".

  • У меня есть много существующих «массивов vars», которые я хотел бы вызывать в цикле for путем «конкатенации строк», чтобы сформировать эти «существующие имена массивов». . Мне нужна работа только для массива 01...
    • Пример существующих «имен массивов»:

      var_mat1=( ".." ".." ".." )  var_mat2=( ".." ".." ".." )       .       .       .  var_matN=( ".." ".." ".." )    
0
dcubaz 12 Апр 2021 в 23:42
$ ./matrix.sh Values of mat_1 : ServerAB ServerFR ServerPE ServerAM ServerHU Indirect value of mat_1: mat_1 ServerAB ServerFR ServerPE ServerAM ServerHU
 – 
dcubaz
12 Апр 2021 в 19:48

2 ответа

Лучший ответ

Мне кажется, у вас проблемы с использованием косвенных переменных.

Чтобы получить доступ к переменной массива, называемой a:

a=(one two t33 f44)

Вам нужна косвенная переменная, которая содержит только то, что вы написали бы внутри конструкции ${...}. Чтобы получить значение ${a[2]}, вам нужна косвенная переменная, установленная в:

indirect=a[2]

А затем используйте его:

$ echo "<${!indirect}>"
<t33>

Я считаю, что вы должны проверить, что находится в indirect_var='${'${st}'[@]}'.

Возможно: indirect_var="${st}[@]" Ваше описание недостаточно ясно, чтобы быть уверенным.

Но поймите, что изменение одной переменной st не приведет к доступу к другим переменным/значениям. Вы должны изменить значение indirect_var, прежде чем оно заработает.

Попробуйте этот сценарий:

#!/bin/bash
mat_1=(ServerAB ServerFR ServerPE ServerAM ServerHU)
mat_2=(SeAB SeFR SePE SeAM SeHU)

st="mat_1";
#indirect_var='${'${st}'[@]}'
indirect_var="${st}[@]"
#(Please, see the "--Desired Ouput Section--" in comments)

#----- What is Hapenning now at output ----
echo "Values of mat_1        : ${mat_1[@]}"
echo "Indirect value of mat_1: ${!indirect_var}"

st=mat_2
echo "This WONT work"
echo "Values of mat_2        : ${mat_2[@]}"
echo "Indirect value of mat_2: ${!indirect_var}"

st=mat_2
indirect_var="${st}[@]"
echo "This DOES work"
echo "Values of mat_2        : ${mat_2[@]}"
echo "Indirect value of mat_2: ${!indirect_var}"


Возможно, вам следует забыть о st и обновить indirect_var по мере необходимости.

Кроме того, нет способа получить количество из косвенной переменной, нет синтаксиса, подобного echo "${!#indirect_var}", но вы вполне можете справиться с этим:

indirect_var="#mat_1[@]"
echo "${!indirect_var}"

Возможно, определите count_indirect_var="#$indirect_var", чтобы получить счет.

Удачи!.

0
ImHere 13 Апр 2021 в 00:13
ОГРОМНОЕ спасибо!, мне действительно нужно улучшить свой английский, но, наконец, вы не поняли меня неправильно и поняли, что мне нужно. Спасибо!
 – 
dcubaz
12 Апр 2021 в 23:45
Пожалуйста, прочитайте отредактированные заметки, я считаю, что они будут полезны. Удачи!
 – 
ImHere
13 Апр 2021 в 00:16
Я читал и тестировал его, но он работал частично, в цикле for он не работал. :(
 – 
dcubaz
13 Апр 2021 в 05:22
Что такое это? Хочешь быть (намного) более конкретным? В каком виде цикла for он не работает? Я считаю, что новый вопрос — разумный способ решить эту новую проблему. @dcubaz
 – 
ImHere
13 Апр 2021 в 05:32

При использовании косвенности используйте только имя переменной (и, возможно, индекс), но не фигурные скобки и знак доллара.

indirect_var=$st[@]  # line 4.
0
choroba 12 Апр 2021 в 19:31
Привет @choroba, спасибо, но это не сработало, это фактический результат, следующий вашему предложению: ` $ ./matrix.sh Значения mat_1 : ServerAB ServerFR ServerPE ServerAM ServerHU Косвенное значение mat_1: mat_1 ServerAB ServerFR ServerPE ServerAM ServerHU `
 – 
dcubaz
12 Апр 2021 в 19:45
Я, наверное, не понимаю. Это то, что у вас есть в разделе «Желаемый результат», верно?
 – 
choroba
12 Апр 2021 в 20:03
Да, именно поэтому я ожидаю, в Desired Output.
 – 
dcubaz
12 Апр 2021 в 21:45
Это результат, который я получаю.
 – 
choroba
12 Апр 2021 в 21:49
Спасибо, я надеюсь, что вы можете помочь мне с выходом.
 – 
dcubaz
12 Апр 2021 в 22:02