[英]Compare adjacent values in Unix array
我有一個像a=( 1 3 2 34 5)
這樣的數組
我想比較彼此相鄰的值(比較 1 與 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'
-謝謝
錯誤是預料之中的。 您正在超出數組大小。 您的循環使用數組的長度為 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
等。
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
哪個打印“相同的”,如果數字是“0”,或“不同的”如果沒有。
輸出:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.