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

use*_*944 5 arrays syntax bash

我有一个数组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
Run Code Online (Sandbox Code Playgroud)

当数组元素大于时,如何bash正确地将值 1 分配给数组元素?b[x+1]a[x+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
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了意外的文件结尾,就好像我缺少一些语法一样。有人知道这个 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
Run Code Online (Sandbox Code Playgroud)

数组数据文件:

 1
 2
 1
 4
 5
 4
 2
 8
Run Code Online (Sandbox Code Playgroud)

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

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

有人知道确切的语法吗?

jas*_*as- -1

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

您应该使用以下命令将其推arraydatafile入数组;

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

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

例如:

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

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

  • 数组索引是一个算术上下文,因此您可以简单地使用“${a[x+1]}” (2认同)