첫 번째 BASH 스크립트를 작성하고 있습니다. c와 c #에 대한 경험이 있으므로 program is correct..it “s 단지 구문이 너무 복잡합니다. 똑같은 것을 작성하는 데 수십억 가지 방법이 있기 때문입니다!
어쨌든 여기에 스크립트가 있습니다. 단순히 인수 (문자열)가 다음과 같은지 확인합니다. 특정 파일에 포함되어 있습니다. 그렇다면 파일의 각 줄을 배열에 저장하고 배열 항목을 파일에 씁니다. 더 쉬운 방법이있을 것 같지만 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
이 코드는 두 번째 항목 만 반환합니다. of myArray (myArray[2]
또는 파일의 두 번째 줄) .. why?
댓글
답변
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))
는
.
grep -A1은 일치 후 한 줄을 인쇄합니다. -x는 -F와 같은 정규식을 비활성화하지만 완전한 l 과만 일치합니다. ines.
grep -x "$name" -A1 phonebook.txt | tail -n1
댓글
- 확인할 수 있습니다 먼저 파일의 내용. 귀하에게 달려 있습니다.
-
-x
는 정규식을 비활성화 하지 않습니다. - 는 확장시 split + glob을 호출합니다. 여기서는 split 부분을 원하지만 glob 부분은 원하지 않으므로 비활성화해야합니다 (
set -o noglob
). -
grep -xFe "$name" -A1 phonebook.txt
또는grep -xFA1 -- "$name" phonebook.txt
이어야합니다. 그렇지 않으면 '가 작동하지 않습니다.$name
가-
로 시작하거나$POSIXLY_CORRECT
가 환경에있는 경우 올바르게 표시됩니다. -
bash
에서는 '[[ $string = $pattern ]]
또는[[ $string = "$otherstring" ]]
. 또는 IOW에서는[[...]]
안에있는=
연산자의 오른쪽에서 단어 확장을 인용해야합니다. ' 패턴으로 받아들이기를 원하지 않습니다.
답변
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]}
댓글
- 그리고 myArray 항목을 반환하는 방법 [name + 1]?
- 인덱싱 된 예에는 이미 솔루션이 있으므로 복사하지 않았습니다. '
- 5 월 잘못되었지만 이러한 파이프를 사용하면 myArray가 루프 외부에 " 보이지 않음 "이 (가) 루프 외부에 있습니까 ???
- @FredericYesidPe ñ aS á nchez 질문이나 답변에 파이프 라인이 포함되어 있지 않으므로 ' 무슨 말을하는지 모르겠습니다.
- " 이름을 읽는 동안 "는 파이프 라인, 어쨌든, 나는 " declare -a array "가 내가 이전에 겪었던 문제를 해결하는 것을 발견했습니다. 감사합니다 !!! +1
답변
“ BASH 읽기 txt 파일 및 배열에 저장 “readarray
에 대해 언급 할 가치가 있다고 생각합니다. 테스트 파일을 배열로 읽는 데 사용하는이 방법의 예는 다음과 같습니다.
readarray -t arrayIPblacklist < /etc/postfix/IP-black-list.txt
이번 방법은 줄 바꿈으로 구분 된 IP 주소 파일을 “ arrayIPblacklist “라는 배열. 전화 번호부 파일에서 작동합니다. 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>
댓글
- 수락 된 답변은 이미
mapfile
를 언급했습니다. 이는readarray
내장. - 내 잘못은 '이를 보지 못했습니다. 감사합니다 @St é phaneChazelas!
grep -P -o "(?<=$NOME\t).+"