使用bc在阵列上执行bash操作

使用bc在阵列上执行bash操作,bash,bc,Bash,Bc,通过阅读bc的手册页,看起来bc可以接受简单变量,但也可以接受数组作为输入 然而,如果我尝试添加两个数组,我只能得到一个元素作为输出 a=(1 2 3) b=(10 11 12) c=`echo "$a + $b" | bc` 那么c只包含11个。是否有办法让bc对阵列中的所有元素进行操作,以生成11 13 15作为输出?或者我需要执行循环吗?bc无法以本机方式访问bash数组,但您可以从两个数组生成一个加法操作流,并将其结果读回第三个数组,因此只需调用bc一次,而不需要为每个循环项运行bc的

通过阅读bc的手册页,看起来bc可以接受简单变量,但也可以接受数组作为输入

然而,如果我尝试添加两个数组,我只能得到一个元素作为输出

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

那么c只包含11个。是否有办法让bc对阵列中的所有元素进行操作,以生成11 13 15作为输出?或者我需要执行循环吗?

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

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

你的作业只能使c成为一个字符串。请注意,当a是数组时,$a隐式引用${a[0]}。bc不是bash的一部分,因此它无法读取内部bash数据结构-bash和bc之间的所有通信都是通过生成和解析字符串进行的。因此,echo$a+b生成一个字符串;bc看不到原始变量,也无法知道它们的值是什么……因此,bc支持数组的意义与Python或awk支持数组的意义相同——它们支持数组,但这些数组与bash数组没有任何关系。您的赋值只会使c成为单个字符串。请注意,当a是数组时,$a隐式引用${a[0]}。bc不是bash的一部分,因此它无法读取内部bash数据结构-bash和bc之间的所有通信都是通过生成和解析字符串进行的。因此,echo$a+b生成一个字符串;bc看不到原始变量,也无法知道它们的值是什么……因此,bc支持数组的意义与Python或awk支持数组的意义相同——它们支持数组,但这些数组与bash数组没有任何关系。