Bash 배열 길이 - 내 코드는 항상 1 또는 0을 제공하지만 무한 가변성을 가져야 합니다.

Bash 배열 길이 - 내 코드는 항상 1 또는 0을 제공하지만 무한 가변성을 가져야 합니다.

예, 비슷한 질문이 제기되었지만 그 답변 중 어느 것도 내가 여기서 무엇을 놓치고 있는지 말해주지 않습니다.

내 문제는 내가 코드로 생성하는 내용을 완전히 이해하지 못하는 것 같습니다.

      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입니다.

관련 정보