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

5

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

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在数组元素a[x+1]大于a[x]时,正确地将值1赋给数组元素b[x+1]
所以如果数组元素a[1]大于a[0],那么b[1]=1
更简单的提问方式是:
如何让它知道数组元素1是否大于0?
 if [ "$a[1]" -gt "$a[0]" ]; 
 then
 echo element 1  greater than element 0
 fi

上述代码出现了“意外的文件结尾”错误,似乎缺少一些语法。有人知道这个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

数组数据文件:

 1
 2
 1
 4
 5
 4
 2
 8

root@debian:/home/l0l/Documents/# bash脚本

脚本第8行: [: 2 : 需要整数表达式 脚本: 第8行: [: 1 : 需要整数表达式 脚本: 第8行: [: 4 : 需要整数表达式 脚本: 第8行: [: 5 : 需要整数表达式 脚本: 第8行: [: 4 : 需要整数表达式

有人知道确切的语法吗?


1
你的语法不正确。在assignments之前没有'$',而且你可以通过${a[$((x+1))]}或者索引不需要加法的情况下${a[$x]}(或者对于索引数组${a[x]})来访问数组中的值。 - David C. Rankin
1
我建议添加一个 done 和一个 fi - Cyrus
这可能会有所帮助:如何调试bash脚本? - Cyrus
2个回答

3
我建议使用以下语法:
if [ "${a[$x+1]}" -gt "${a[$x]}" ]; then  # with { and }
  b[x+1]=1                                # without $

虽然bash允许您这样做,但当进行加法运算时,我总是使用算术运算符。对于索引数组,bash还允许${a[x]} - David C. Rankin
只读取时,这种方法不起作用。 echo b[x] 可以工作,但 echo b[x+1] 不行。我该怎么做? - Mote Zart
@MoteZart:如果你使用bash,这个应该可以工作:b=(x y z); echo "${b[x]} ${b[x+1]}" - Cyrus

-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))) 这个片段将比较数组 ab 并提供两者的交集。有关使用 comm 的更多信息,请参阅手册页;即 man comm

b[[$((x+1))]=1 这是什么意思?难道不是通过 ${a[$((x+1))]} 访问数组元素的吗? - David C. Rankin
2
数组索引是一个算术上下文,因此您可以简单地使用${a[x+1]} - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接