Небольшая вариация с циклом, использующим троичный условный оператор и без предположений о диапазоне значений:
arr=(4 2 8 9 1 0)
max=${arr[0]}
maxIdx=0
for ((i = 1; i < ${#arr[@]}; ++i)); do
maxIdx=$((arr[i] > max ? i : maxIdx))
max=$((arr[i] > max ? arr[i] : max))
done
printf '%s index => values %s\n' "$maxIdx" "$max"
Единственное допущение состоит в том, что индексы массива являются смежными.Если это не так, это становится немного более сложным:
arr=([1]=4 [3]=2 [5]=8 [7]=9 [9]=1 [11]=0)
indices=("${!arr[@]}")
maxIdx=${indices[0]}
max=${arr[maxIdx]}
for i in "${indices[@]:1}"; do
((arr[i] <= max)) && continue
maxIdx=$i
max=${arr[i]}
done
printf '%s index => values %s\n' "$maxIdx" "$max"
Это сначала возвращает индексы в отдельный массив и устанавливает начальный максимум на значение, соответствующее первому индексу;затем он перебирает индексы, пропуская первый (нотация :1
), проверяет, является ли текущий элемент новым максимумом, и если это так, сохраняет индекс и максимум.