저는 첫 번째 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>