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

时间:2014-07-16 09:35:18

标签: 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]="MEMORY" ;  then

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

 done

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

array=($(cat fileName))

不需要循环。

现在,问你原来的问题:你似乎混淆了arraymyArray,还是两个不同的东西?我们假设它们是相同的;所以我想你想在项目MEMORY之后直接输出项目(这就是你的代码的样子)。你可以这样做:

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

答案 2 :(得分:0)

简单地:

#!/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
  • readarray将输入行转换为数组
  • ${!myArray[@]}填充索引,而不是元素本身
  • printf '%s\n'将每个参数打印为一行(创建多行)。
  • "${myArray[@]:i + 1}"表示匹配元素之后的所有元素,并扩展为多个参数。

请参阅Bash Reference Manual了解所有内容。