Как получить значение из таблицы массива в Bash

#arrays #bash

#массивы #bash

Вопрос:

Я создал таблицу массива, но хочу получить второе значение на основе первого значения.

Для приведенной ниже таблицы, в основном, я хочу, чтобы, если животное — корова, покажите мне «му»; если это динозавр, покажите мне «рев»…

 ARRAY=( "cow:moo"
        "dinosaur:roar"
        "bird:chirp"
        "bash:rock" )
  

Ответ №1:

Вместо этого используйте ассоциативный массив.

 $ declare -A array
$ array=([cow]=moo [dinosaur]=roar [bird]=chirp [bash]=rock)
$ echo "${array[cow]}"
moo
  

Вы можете автоматически сгенерировать указанное выше из своего оригинала:

 old_array=( "cow:moo" "dinosaur:roar" "bird:chirp" "bash:rock" )
declare -A array
for x in "${old_array[@]}"; do
  IFS=: read key value <<< "$x"
  # Or
  # key=${x%%:*}
  # value=${x#*:}
  array[$key]=$value
done
  

Ответ №2:

Вы также можете захотеть провести рефакторинг и использовать параллельные массивы.

 animal=( cow dinosaur bird )
sound=( moo road chirp )
for ndx in "${!animal[@]}"
do echo "${animal[ndx]}: ${sound[ndx]}"
done
cow: moo
dinosaur: road
bird: chirp
  

Или, как сказал Чепнер, используйте ассоциативный массив —

 declare -A sound=(
   [cow]=moo
   [dinosaur]=roar
   [bird]=chirp
)
for critter in "${!sound[@]}"
do echo "$critter: ${sound[$critter]}"
done  # note that these will be unordered
dinosaur: roar
cow: moo
bird: chirp
  

Я бы использовал ассоциативный.