web-dev-qa-db-ja.com

BASHはtxtファイルを読み取り、配列に格納します

私は最初のBASHスクリプトを書いています。cとc#の経験があるので、プログラムのロジックは正しいと思います。同じことを書く方法は数十億あるため、構文は非常に複雑です。

とにかく、ここにスクリプトがあります。引数(文字列)が特定のファイルに含まれているかどうかを確認するだけです。ある場合は、ファイルの各行を配列に格納し、配列の項目をファイルに書き込みます。私はそれを達成するためのより簡単な方法があるはずだと確信していますが、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

このコードは、myArray(myArray[2]またはファイルの2行目)。

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

Bash 4では、IFS=$'\n' a=($(cat phonebook.txt))を_mapfile -t a < phonebook.txt_に置き換えることができます。

grep -A1は、一致の後に1行を出力します。 -xは-Fと同様に正規表現を無効にしますが、完全な行にのみ一致します。

_grep -x "$name" -A1 phonebook.txt | tail -n1
_
9
Lri
index=0
while read line; do
  myArray[index]="$line"
done < inputfile

新しいバージョンのbashは連想配列をサポートしています。それはそれをより簡単にします:

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

echo ${myArray[name]}
2
Hauke Laging