У меня есть что-то в bash
как
myArray=('red' 'orange' 'green')
И я хотел бы сделать что-то вроде
echo ${myArray['green']}
Что в этом случае выводит 2
. Возможно ли это?
У меня есть что-то в bash
как
myArray=('red' 'orange' 'green')
И я хотел бы сделать что-то вроде
echo ${myArray['green']}
Что в этом случае выводит 2
. Возможно ли это?
Это будет сделано:
#!/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()), вы можете сделать ее общим
Вы должны объявить массив перед использованием
declare -A myArray
myArray=([red]=1 [orange]=2 [green]=3)
echo ${myArray['orange']}
Нет. Вы можете индексировать простой массив с целым числом в bash
. Ассоциативные массивы (введенные в bash
4) могут быть проиндексированы по строкам. Однако они не обеспечивают тип обратного поиска, который вы запрашиваете, без специально сконструированного ассоциативного массива.
$ declare -A myArray
$ myArray=([red]=0 [orange]=1 [green]=2)
$ echo ${myArray[green]}
2
Существует также один сложный способ:
echo ${myArray[@]/green//} | cut -d/ -f1 | wc -w | tr -d ' '
И вы получите 2 Вот ссылки
Это просто еще один способ инициализации ассоциативного массива, как показала Чепнер.
Не забывайте, что вам нужно явно указать 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
Мне нравится это решение:
let "n=(`echo ${myArray[@]} | tr -s " " "\n" | grep -n "green" | cut -d":" -f 1`)-1"
Переменная n будет содержать результат!
Это может работать только для массивов,
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'
В zsh вы можете сделать
xs=( foo bar qux )
echo ${xs[(ie)bar]}
см. zshparam (1) подраздел Флаги подстроки