BASH는 txt 파일을 읽고 배열에 저장합니다.

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]또는 파일의 두 번째 행)만 반환합니다. 왜 그럴까요?

답변1

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은 일치 후에 한 줄을 인쇄합니다. -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>

관련 정보