我有一个像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
答案 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