【问题标题】:How to compare array elements in BASH?如何比较 BASH 中的数组元素?
【发布时间】:2018-01-14 06:47:21
【问题描述】:

我有一个数组 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

当数组元素a[x+1] 大于a[x] 时,如何让bash 正确地将值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

上面的代码给出了 UNEXPECTED END OF FILE,就好像我遗漏了一些语法一样。有人知道这个 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 : 需要整数表达式

有人知道确切的语法吗?

【问题讨论】:

  • 您的语法不正确。 assignments 之前没有'$',您可以使用例如访问数组中的值${a[$((x+1))]} 或在索引上没有添加的地方${a[$x]}(或索引数组${a[x]}
  • 我建议添加一个done 和一个fi
  • 这可能会有所帮助:How to debug a bash script?

标签: arrays bash syntax


【解决方案1】:

我建议这样的语法:

if [ "${a[$x+1]}" -gt "${a[$x]}" ]; then  # with { and }
  b[x+1]=1                                # without $

【讨论】:

  • 虽然 bash 可以让您侥幸逃脱,但在进行加法运算时,我总是使用 算术运算符。对于索引数组,bash 还允许 ${a[x]}
  • 这在尝试只读时不起作用。 echo b[x] 有效,但 echo b[x+1] 无效。我该怎么做?
  • @MoteZart:如果您使用bash,这应该可以:b=(x y z); echo "${b[x]} ${b[x+1]}"
【解决方案2】:

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

您应该使用以下内容将arraydatafile 推入数组中;

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

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

例如:

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

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

【讨论】:

  • b[[$((x+1))]=1 ??并且不是访问的数组元素,例如${a[$((x+1))]} ?
  • 数组索引是一个算术上下文,所以你可以简单地使用${a[x+1]}
猜你喜欢
  • 1970-01-01
  • 2016-03-25
  • 2020-07-16
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多