如何比较BASH中的数组元素?

时间:2018-01-14 06:47:22

标签: arrays bash syntax

我有一个数组ab,我需要正确的bash语法来比较for循环中的数组元素:

for ((x=0;x<10;x++)); do
    if [ "$a[$x+1]" -gt "$a[$x]" ]; then
        $b[x+1]=1
    if [ "$a[$x+1]" -lt "$a[$x]" ]; then 
        $b[x+1]=0
    fi

当数组元素bash大于b[x+1]时,如何让a[x+1]正确地将值1分配给数组元素a[x]

因此,如果数组元素a[1]大于a[0],那么b[1]=1

提出这个问题的一种更简单的方法,那就更简单了:

如果数组元素1大于0,我怎么知道呢?

 if [ "$a[1]" -gt "$a[0]" ]; 
 then
 echo element 1  greater than element 0
 fi

上面的代码给出了UNEXPECTED END OF FILE,好像我缺少一些语法。有人知道这个BASH语法吗?

更新: 所以这是脚本文件:

 #!/bin/bash
 declare -a a
 declare -a b
 readarray a < arraydatafile 

 for ((x=0;x<5;x++)); 
 do
 if [ "${a[$x+1]}" -gt "${a[$x]}" ]; 
 then  
 b[x+1]=1   
 fi
 done

arraydatafile:

 1
 2
 1
 4
 5
 4
 2
 8

root @ debian:/ home / l0l / Documents / #bash script

脚本第8行:[:2 :预期的整数表达式 脚本:第8行:[:1 :预期的整数表达式 脚本:第8行:[:4 :预期的整数表达式 脚本:第8行:[:5 :预期的整数表达式 脚本:第8行:[:4 :期望的整数表达式

任何人都知道确切的语法吗?

2 个答案:

答案 0 :(得分:2)

我建议使用这种语法:

if [ "${a[$x+1]}" -gt "${a[$x]}" ]; then  # with { and }
  b[x+1]=1                                # without $

答案 1 :(得分:-1)

在bash中,ltgt条件需要一个整数值。如果arraydatafile的内容不包含严格的整数,您将收到正在处理的错误。

您应该使用以下内容将arraydatafile推送到数组中;

declare -a a; a=($(cat arraydatafile))

在处理数组比较时,您可以使用comm二进制文件。

例如:

$(comm -13 <(printf '%s\n' "${a[@]}"|sort -u) <(printf '%s\n' "${b[@]}"|sort -u)))

该snippit将比较数组a&amp; b并提供两者的交集。有关使用comm的更多信息,请参阅手册页;即man comm