O problema é sua matriz. Parece que você criou um array com apenas um elemento. Experimente este exemplo:
array=("$(printf 'Apple\nBanana\nClementine\nDate')")
for ((i = 0; i < ${#array[@]}; i++)); do
printf '%d. %s\n' $((i+1)) "${array[$i]}"
done
j=0
for e in "${array[@]}"; do
j=$((j+1))
printf '%d. %s\n' "$j" "$e"
done
k=0
for e in ${array[@]}; do
k=$((k+1))
printf '%d. %s\n' "$k" "$e"
done
Em seguida, execute:
$ ./test.sh
1. Apple
Banana
Clementine
Date
1. Apple
Banana
Clementine
Date
1. Apple
2. Banana
3. Clementine
4. Date
Você pode ver, você realmente cria uma matriz contém um elemento. O terceiro loop imprime quatro elementos porque o shell executou a divisão de campo na string Apple\nBanana\nClementine\nDate
, que deu a você quatro palavras separadas de volta.
Se você alterar a matriz para:
set -f
array=( $(printf 'Apple\nBanana\nClementine\nDate') )
set +f
( set -f
desativa a expansão de curingas, caso os caracteres *?\[
apareçam na saída do comando) você obterá o resultado desejado, que é a saída do comando que é dividida nos espaços em branco:
$ ./test.sh
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date
Uma nota que você deve usar aspas duplas "${array[@]}"
quando quiser iterar através de todos os elementos da matriz, ou usar o estilo c para loop como no meu primeiro exemplo.