【问题标题】:bash operations on arrays using bc使用 bc 对数组进行 bash 操作
【发布时间】:2019-02-25 13:28:27
【问题描述】:

从阅读 bc 的手册页来看,bc 似乎可以接受简单的变量,也可以接受数组作为输入。

但是,如果我尝试添加两个数组,我只会得到一个元素作为输出

a=(1 2 3)
b=(10 11 12)
c=`echo "$a + $b" | bc`

那么 c 只包含 11。如果有办法让 bc 对数组中的所有元素进行操作以产生 (11 13 15) 作为输出?还是我需要做一个循环?

【问题讨论】:

  • 您的分配只会永远使c 成为一个字符串。请注意,当a 是一个数组时,"$a" 隐含指向"${a[0]}"
  • bc 不是 bash 的一部分,因此它无法读取内部 bash 数据结构——bash 和 bc 之间的所有通信都是通过字符串的生成和解析来实现的。因此,echo "$a + $b" 正在生成单个字符串; bc 看不到原始变量,也无法知道它们的值是什么。
  • ...因此,bc 对数组的支持与 Python 或 awk 支持数组的意义相同——它们支持,但这些数组与 bash 没有任何关系数组。

标签: bash bc


【解决方案1】:

bc 不能本地访问 bash 数组,但您可以从两个数组生成一个加法操作流,并将它们的结果读回第三个数组(因此只需要调用一次 bc,而不是运行bc 每个循环条目的单独副本):

a=(1 2 3)
b=(10 11 12)

readarray -t c < <(for idx in "${!a[@]}"; do
  echo "${a[$idx]} + ${b[$idx]}"
done | bc)
declare -p c              # print output as an array definition
printf '%s\n' "${c[@]}"   # print output one entry per line

https://ideone.com/YuPhQP 看到这个运行,正确地作为输出发出:

declare -a c=([0]="11" [1]="13" [2]="15")
11
13
15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多