BASHはtxtファイルを読み取り、配列に保存します。

BASHはtxtファイルを読み取り、配列に保存します。

私は最初のBASHスクリプトを書いており、cとC#の経験があるので、プログラムのロジックが正しいと思います。同じものを書く方法が何十億ものものになるので、構文が複雑すぎるということです!

とにかくスクリプトは次のようになります。引数(文字列)が特定のファイルに含まれていることを確認してください。その場合は、ファイルの各行を配列に保存し、その配列の1つの項目をファイルに書き込みます。これを達成するより簡単な方法があると確信していますが、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の2番目のエントリ(myArray[2]またはファイルの2番目の行)のみを返します。なぜですか?

答え1

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

Bash 4IFS=$'\n' a=($(cat phonebook.txt))ではmapfile -t a < phonebook.txt

grep -A1 は一致後に 1 行を印刷します。 -x は -F などの正規表現を無効にしますが、完全な行にのみ一致します。

grep -x "$name" -A1 phonebook.txt | tail -n1

答え2

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]}

答え3

「というタイトルの記事からBASHはtxtファイルを読み取り、配列に保存します。「私はreadarray言及する価値があると思いました。テストファイルを配列に読み込むために使用する方法の例は次のとおりです。

readarray -t arrayIPblacklist < /etc/postfix/IP-black-list.txt

上記のコードは、改行で区切られたIPアドレスファイルを次の配列にロードします。アレイIPブラックリスト". 登録簿ファイル用.readarrayは bash 4 に導入されているため、この方法は以前の bash バージョンを実行している古いホストでは機能しません。

この-tオプションは、ほとんどの場合改行文字を含めたくないため、すべての要素から改行文字を削除します。

$ seq 3 | bash -c 'readarray a; printf "<%q>\n" "${a[@]}"'
<$'1\n'>
<$'2\n'>
<$'3\n'>
$ seq 3 | bash -c 'readarray -t a; printf "<%q>\n" "${a[@]}"'
<1>
<2>
<3>

関連情報