Arrays 数组索引中的Bash算法不起作用

Arrays 数组索引中的Bash算法不起作用,arrays,bash,Arrays,Bash,我有一个bash脚本,其中我需要根据条件检查数组,如果它匹配,我需要在特定匹配之后打印行。我的代码如下:echo${myArray[($k+1))]}不工作 i=0; for j in `cat sdp_aDT_dhk1smc3_Periodic_20140711.log` do array[$i]=$j; i=$(($i+1)); done k=0; for k in myArray; do if myArray[$k]="MEMO

我有一个bash脚本,其中我需要根据条件检查数组,如果它匹配,我需要在特定匹配之后打印行。我的代码如下:
echo${myArray[($k+1))]}
不工作

i=0;
for j in `cat sdp_aDT_dhk1smc3_Periodic_20140711.log` 
do
    array[$i]=$j; 

    i=$(($i+1)); 

done 
k=0;

for k in myArray;
    do
          if   myArray[$k]="MEMORY" ;  then

             echo ${myArray[(($k+1))]}
          fi

 done

如果您只想打印符合您特定条件的行,请尝试

myArray=`cat sdp_aDT_dhk1smc3_Periodic_20140711.log`
for k in $myArray;
do
    if [ "$k" = "MEMORY" ]
    then
        echo "$k"
    fi
done

您可以使用以下命令将该文件内容读入数组:

array=($(cat fileName))
不需要循环

现在,回到您最初的问题:您似乎混淆了
array
myArray
,或者它们是两种不同的东西?让我们假设他们注定是一样的;因此,我认为您希望直接在items
MEMORY
之后输出这些项(这就是您的代码的样子)。您可以这样做:

flag=false
for k in "${array[@]}"
do
    $flag && echo "$k"
    if [ "$k" = "MEMORY" ]
    then
        flag=true
    else
        flag=false
    fi
done
简单地说:

#!/bin/bash
readarray -t myArray < sdp_aDT_dhk1smc3_Periodic_20140711.log
for i in "${!myArray[@]}"; do
    if [[ ${myArray[i]} == 'MEMORY' ]]; then
        printf '%s\n' "${myArray[@]:i + 1}"
        break
    fi
done
#/bin/bash
readarray-t myArray
  • readarray
    将行从输入转换为数组
  • ${!myArray[@]}
    填充索引,而不是元素本身
  • printf“%s\n”
    将每个参数打印为一行(创建多行)
  • “${myArray[@]:i+1}”
    表示匹配元素之后的所有元素,并展开为多个参数

所有信息请参阅。

您在
($k+1))
之前缺少了
$
。这真的是您的真实代码吗?至少myArray应该是$myArray谢谢大家..非常有用