比较Unix数组中的相邻值

时间:2016-04-27 21:50:59

标签: arrays shell unix

我有一个像a=( 1 3 2 34 5)

这样的数组

我想比较彼此相邻的值(将3与3比较,3比较2比2与34比较等)。

如果消息相同则打印消息1,否则打印消息2。

a=( 1 1 2 34 5)
len=${#a[@]}
for  i in `seq 0 $len`
do
if [ ${a[i]} -eq ${a[i+1]} ]; then

echo "values are same"
else
echo "values are different"
fi

完成

比较值34和5后,抛出错误。

+ '[' 34 -eq 5 ']'
+ echo 'values are different'
 values are different
+ for i in '`seq 0 $len`'
 + '[' 5 -eq ']'
 b.sh: line 27: [: 5: unary operator expected
+ echo 'values are different'

-Thanks

2 个答案:

答案 0 :(得分:1)

预计会出错。你超越了数组大小。你的循环使用数组的长度为5,你继续将最后一个元素与下一个不存在的元素进行比较。你应该停止比较小于大小。请考虑以下示例:

#!/bin/bash

array=(1 1 2 34 5)

for ((index=0; index < ${#array[@]} - 1; index++)); do
    echo "--> ${array[index]} | ${array[index + 1]} <--"
    if [[ ${array[index]} -eq ${array[index + 1]} ]]; then
        echo "values are same"
    else
        echo "values are different"
    fi
done

<强>输出:

--> 1 | 1 <--
values are same
--> 1 | 2 <--
values are different
--> 2 | 34 <--
values are different
--> 34 | 5 <--
values are different

您的脚本有一些改进。使用[[代替[。避免不必要地使用seq等。

答案 1 :(得分:0)

Debian的 num-utils 包中包含util numinterval,用来比较 STDIN 中的相邻值。这是一些代码:

printf "%s\n" ${a[*]}  | numinterval | sed -n 's/0/same/p;t;s/.*/different/p'

工作原理:printf数组${a[*]}中的每个值位于不同的行上,导管为numinterval,然后sed打印&#34; 相同< / EM>&#34;如果数字是&#34; 0 &#34;或者&#34; 不同&#34;如果没有。

输出:

same
different
different
different

可以清除相同的代码以生成一个快速比较图表,(读起来像三角形,左边是长边):

paste <(printf "%s\n" ${a[*]}) \
      <(printf "%s\n" ${a[*]} | numinterval) \
      <(printf "%s\n" ${a[*]} | numinterval | 
        sed -n 's/0/same/p;t;s/.*/different/p')

......输出:

1   0   same
1   1   different
2   32  different
34  -29 different
5