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 的计数。

相关内容