#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
Я бы использовал ассоциативный.