para loop não funcionando para várias linhas

1

Eu tenho uma matriz como esta "Apple Clementine Date"

Eu tenho que imprimir assim:

1. Apple
2. Banana
3. Clementine
4. Date

Arquivo de script:

for i in "${fruits[@]}"; do
    echo "$lineno. $i "
    lineno+=1
done

saída do myscript:

1.             Apple
               Banana
               Clem....

Não entendo por que não está imprimindo o lineno e também por que ele está imprimindo um longo intervalo entre 1. e Apple . Obrigado.

    
por gangadhars 28.11.2014 / 10:43

2 respostas

2

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.

    
por 28.11.2014 / 11:21
0

Isso é o que você precisa:

[sreeraj@server ~]$ fruits=(Apple Banana Clementine Date)
[sreeraj@server ~]$ (IFS=$'\n'; echo "${fruits[*]}") | nl
     1  Apple
     2  Banana
     3  Clementine
     4  Date
[sreeraj@server ~]$
    
por 28.11.2014 / 12:19