Подтвердить что ты не робот

Массив Bash; получить индекс от стоимости

У меня есть что-то в bash как

myArray=('red' 'orange' 'green')

И я хотел бы сделать что-то вроде

echo ${myArray['green']}

Что в этом случае выводит 2. Возможно ли это?

4b9b3361

Ответ 1

Это будет сделано:

#!/bin/bash

my_array=(red orange green)
value='green'

for i in "${!my_array[@]}"; do
   if [[ "${my_array[$i]}" = "${value}" ]]; then
       echo "${i}";
   fi
done

Очевидно, что если вы превратите это в функцию (например, get_index()), вы можете сделать ее общим

Ответ 2

Вы должны объявить массив перед использованием

declare -A myArray
myArray=([red]=1 [orange]=2 [green]=3)
echo ${myArray['orange']}

Ответ 3

Нет. Вы можете индексировать простой массив с целым числом в bash. Ассоциативные массивы (введенные в bash 4) могут быть проиндексированы по строкам. Однако они не обеспечивают тип обратного поиска, который вы запрашиваете, без специально сконструированного ассоциативного массива.

$ declare -A myArray
$ myArray=([red]=0 [orange]=1 [green]=2)
$ echo ${myArray[green]}
2

Ответ 4

Существует также один сложный способ:

echo ${myArray[@]/green//} | cut -d/ -f1 | wc -w | tr -d ' '

И вы получите 2 Вот ссылки

Ответ 5

Это просто еще один способ инициализации ассоциативного массива, как показала Чепнер. Не забывайте, что вам нужно явно указать declare или typset ассоциативный массив с атрибутом -A.

i=0; declare -A myArray=( [red]=$((i++)) [orange]=$((i++)) [green]=$((i++)) )
echo ${myArray[green]}
2

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

Если у вас есть много значений для добавления, это может помочь разместить их на отдельных строках.

i=0; declare -A myArray; 
myArray+=( [red]=$((i++)) )
myArray+=( [orange]=$((i++)) )
myArray+=( [green]=$((i++)) )
echo ${myArray[green]}
2

Скажите, что вам нужен массив цифр и строчных букв (например: для выбора меню), вы также можете сделать что-то вроде этого.

declare -a mKeys_1=( {{0..9},{a..z}} );
i=0; declare -A mKeys_1_Lookup; eval mKeys_1_Lookup[{{0..9},{a..z}}]="$((i++))";

Если вы запустите

echo "${mKeys_1[15]}"
f
echo "${mKeys_1_Lookup[f]}"
15

Ответ 6

Мне нравится это решение:

let "n=(`echo ${myArray[@]} | tr -s " " "\n" | grep -n "green" | cut -d":" -f 1`)-1"

Переменная n будет содержать результат!

Ответ 7

Это может работать только для массивов,

my_array=(red orange green)
echo "$(printf "%s\n" "${my_array[@]}")" | grep -n '^orange$' | sed 's/:orange//'

Вывод:

2

Если вы хотите найти индекс заголовка в файле tsv,

head -n 1 tsv_filename | sed 's/\t/\n/g' | grep -n '^header_name$' | sed 's/:header_name//g'

Ответ 8

В zsh вы можете сделать

xs=( foo bar qux )
echo ${xs[(ie)bar]}

см. zshparam (1) подраздел Флаги подстроки