BASH lendo o arquivo txt e armazenando no array

4

Estou escrevendo meu primeiro script BASH, tenho alguma experiência com c e c #, então acho que a lógica do programa é correta ... é apenas a sintaxe é tão complicada porque aparentemente há bilhões de maneiras de escrever o mesmo coisa!

De qualquer forma aqui está o script: ele simplesmente verifica se o argumento (string) está contido em um determinado arquivo. Se assim for, armazena cada linha do arquivo em uma matriz e grava um item da matriz em um arquivo. Tenho certeza que deve haver maneiras mais fáceis de conseguir isso, mas eu quero fazer alguma prática com loops bash

    #!/bin/bash

NOME=$1
c=0


#IF NAME IS FOUND IN THE PHONEBOOK THANK STORE EACH LINE OF THE FILE INTO ARRAY
#ONCE THE ARRAY IS DONE GET THE INDEX OF MATCHING NAME AND RETURN ARRAY[INDEX+1]

if grep  "$NOME" /root/phonebook.txt ; then
        echo "CREATING ARRAY"
        while read line
        do
                myArray[$c]=$line # store line
                c=$(expr $c + 1) # increase counter by 1
        done < /root/phonebook.txt

else
        echo "Name not found"
fi

c=0
for i in myArray;
        do
              if   myArray[$i]="$NOME" ;  then
                 echo ${myArray[i+1]} >> /root/numbertocall.txt
              fi

done

Este código retorna apenas o segundo item de myArray ( myArray[2] ou a segunda linha do arquivo) .. por que?

    
por Aaron Ullal 02.04.2013 / 22:19

2 respostas

7
IFS=$'\n' a=($(cat phonebook.txt))
for i in $(seq ${#a[*]}); do
    [[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done

No Bash, 4 IFS=$'\n' a=($(cat phonebook.txt)) pode ser substituído por mapfile -t a < phonebook.txt .

grep -A1 imprime uma linha após a partida. -x desativa o regex como -F mas apenas combina linhas completas.

grep -x "$name" -A1 phonebook.txt | tail -n1
    
por 02.04.2013 / 23:45
2
index=0
while read line; do
  myArray[index]="$line"
done < inputfile

Versões mais recentes do bash suportam matrizes associativas. Isso facilitaria:

declare -A myArray
while read name; do
  read number
  myArray[name]="$number"
done < inputfile

echo ${myArray[name]}
    
por 02.04.2013 / 23:35