Arrays Bash数组-对移动位置的成员执行某些操作

Arrays Bash数组-对移动位置的成员执行某些操作,arrays,bash,Arrays,Bash,我有以下带有数组变量的简化脚本: array1=(`somecommand1`) for i in ${array1[@]} ; do echo $1 done 这将给我以下输出: 1 277788 2 283871 3 282913 4 283519 5 283568 6 283563 7 283595 8 278229 9 283029 10 278654 11 280508 12 248825 13 282361 . 在每次运行脚本时,当${array1}更改时

我有以下带有数组变量的简化脚本:

array1=(`somecommand1`)

for i in ${array1[@]} ; do
echo $1
done
这将给我以下输出:

 1 277788
 2 283871
 3 282913
 4 283519
 5 283568
 6 283563
 7 283595
 8 278229
 9 283029
10 278654
11 280508
12 248825
13 282361
 . 
在每次运行脚本时,当${array1}更改时,我需要运行 对那些移动到数组顶部的数字执行一些命令,加上我想检查一个可能保持不变的命令,发出
checkcmd
,该命令将获得一个时间戳,并将其与上一次运行的时间戳进行比较

 1 283563 <- moved=modified
 2 283871 <- moved=modified (overtook 277788)
 3 277788 <- modified? `checkcmd 277788` timestamp changed = modified, so check the #4
 4 282913 `checkcmd 282913` -> timestamp unchanged -> do not check further
 5 283519
 6 283568
 7 283595
 8 278229
 9 283029
10 278654
11 280508
12 248825
13 282361
我怎样才能做到这一点?我不想在每个${array1}成员上运行
checkcmd
,因为由于来自服务器的轮询数据,每个
checkcmd
都需要很长时间才能执行,而且${array1}中甚至可能有数百个成员,因此这会使此脚本无法使用。 我希望会有一些“函数”可以像这样相互比较数组,并且按照上面解释的逻辑,
checkcmd
只能运行一次或两次

  • 保留柜台:

     n=0; for i in "${array1[@]}"; do printf "%2d %s\n" $((++n)) "$i"; done
    
  • 你需要比较一下

    for idx in "${array1[@]}"; do
        if (( ${array1[idx]} == ${array2[idx]} )); then
            echo "they are the same: ${array1[idx]}"
        else
            echo "they are the same: ${array1[idx]} <=> ${array2[idx]}"
        fi
    done
    
    “${array1[@]}”中idx的
    ;做
    if(${array1[idx]}==${array2[idx]}));然后
    echo“它们是相同的:${array1[idx]}”
    其他的
    echo“它们是相同的:${array1[idx]}${array2[idx]}”
    fi
    完成
    

  • 另一种使用索引打印的方法,使用c样式循环

    for (( i=0; i<${#arr1[@]}; ++i )); do
        echo $i ${arr1[i]}
    done
    

    for((i=0;i避免在一篇文章中提出多个问题。好的,我想我应该,会记得,谢谢你解决了我编辑的第一部分,因为它是第2篇的主题。我不确定如何实现这个想法,因为${array2}未在任何地方定义?是否有方法存储每次运行的数组并将其保留到下一次运行,以便我可以比较两者?您需要使用单独的变量。重新分配变量后,以前的值将丢失。
    
    for (( i=0; i<${#arr1[@]}; ++i )); do
        echo $i ${arr1[i]}
    done