![Bash 배열 길이 - 내 코드는 항상 1 또는 0을 제공하지만 무한 가변성을 가져야 합니다.](https://linux55.com/image/161311/Bash%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%20-%20%EB%82%B4%20%EC%BD%94%EB%93%9C%EB%8A%94%20%ED%95%AD%EC%83%81%201%20%EB%98%90%EB%8A%94%200%EC%9D%84%20%EC%A0%9C%EA%B3%B5%ED%95%98%EC%A7%80%EB%A7%8C%20%EB%AC%B4%ED%95%9C%20%EA%B0%80%EB%B3%80%EC%84%B1%EC%9D%84%20%EA%B0%80%EC%A0%B8%EC%95%BC%20%ED%95%A9%EB%8B%88%EB%8B%A4..png)
예, 비슷한 질문이 제기되었지만 그 답변 중 어느 것도 내가 여기서 무엇을 놓치고 있는지 말해주지 않습니다.
내 문제는 내가 코드로 생성하는 내용을 완전히 이해하지 못하는 것 같습니다.
LOGFILE=$1
ERROR=$2
START_TIME=$3
END_TIME=$4
FILEDATE=$(echo "${NOW//-}")
FINDSTR='10\.22\.*'
GREP=/bin/zgrep
for (( HOUR=START_TIME ; HOUR <= END_TIME ; HOUR++ )); do
DATE=$(printf "$NOW %02d" $HOUR )
echo
printf "%02d:00\n" $HOUR
ERRORSTORES=$($GREP "$ERROR" $( find /opt/logs/ -name $LOGFILE-$FILEDATE* |
grep $FINDSTR ) | grep "$DATE" | awk -F ' ' '{ print $4 }' |
awk '{a[$0]++}END{for(i in a){printf ("%s\t%d\n", i, a[i])}}')
printf "Stores showing \"%s\": %d\n" "$ERROR" "${#ERRORSTORES[*]}"
printf '%s\n' "${ERRORSTORES[@]}"
done
이 글의 목적에 맞게 코드를 단순화하려고 노력했습니다. 명령줄 입력을 얻는 많은 작업 코드를 간단한 VAR=$n 할당으로 대체했습니다.
내 문제는 라인에 있습니다
`printf "Stores showing \"%s\": %d\n" "$ERROR" "${#ERRORSTORES[@]}"`
다른 사이트에서 그녀에 대해 찾은 모든 것으로부터 "${#array[@]}"
배열의 요소 수를 알 수 있습니다. 하지만 "${#ERRORSTORES[@]}"
항상 1 또는 0이 인쇄됩니다!
나는 이제 이 글을 쓰는 동안 내 문제가 줄 끝에 있는 awk 필터의 printf에 있다고 의심합니다 ERRORSTORES=$(...)
. 나는 \n으로 끝나는 printf가 내가 원하는 출력(각 요소에 개행 문자)을 제공하지만 패턴을 엉망으로 만든다고 추측합니다 "${#array[@]}"
.
내가 이해한 바에 따르면 대신 널 문자가 필요 \n
하지만 지금까지 \n을 널 문자로 바꾸는 방법을 찾지 못했습니다. 나는 그것을 시도 \0
했고 \n\0
. 첫 번째는 하나의 큰 줄에 내 출력을 연결합니다. 두 번째 항목은 여전히 내가 원하는 행당 하나의 요소를 제공하지만 개수도 1입니다.