【问题标题】:Using bc in bash for loop array doesn't calculate first input?在 bash 中使用 bc 循环数组不计算第一个输入?
【发布时间】:2022-01-15 04:26:57
【问题描述】:

我正在努力通过 for 循环传递一个多行浮点数数组,让它运行一个计算,然后从输出中定义一个新变量。

这是我的 Bash 的简化版本:

inputs=$(echo "12.12
34.34")

New_array=$( for var in "${inputs[@]}"; do
                 echo "${var}*2"| bc -l;
             done )

我希望echo "$New_array" 的结果是这样的:

$ echo "$New_array"
24.24
68.68

但我明白了吗?

$ echo "$New_array"
12.12
68.68

或者在我进行故障排除时(例如删除 $New_array 变量):

(standard_in) 1: syntax error

相信这个问题与第一个循环的输入被读取的行返回有关吗?但是我尝试过的解决方案到目前为止都没有奏效。

我哪里错了?

【问题讨论】:

  • 你的代码中没有数组...
  • 你能添加你用来运行脚本的命令吗?
  • @kpie,只是bash scriptname.sh?如果有帮助,我只在终端中调试过这个?
  • 您的两个变量实际上都不是数组,它们都是中间有换行符的字符串(使它们成为两行文本),但是您循环 inputs 的方式需要它是一个实际的数组。请参阅 this questionthis one on the Unix&Linux SE。你真的想使用数组(通常更干净)还是多行字符串?顺便说一句,$(echo something) 几乎总是一个错误——$( )echo 基本上相互抵消。
  • @KyranMcDonnell 其他一些注意事项:如果您不使用实际数组,则应删除[@](即使用$inputs${inputs} 而不是${inputs[@]})。另外,请注意,使用不带引号的变量会导致任何看起来像文件名通配符的内容扩展为匹配文件名的列表,例如在2 * 3 中,* 将替换为当前目录中的文件名列表。这是首选实际数组的原因之一。

标签: bash for-loop syntax-error


【解决方案1】:

这可能是你想要做的:

#!/bin/bash

inputs=(12.12 34.34)

for var in "${inputs[@]}"; do
    New_array+=("$(bc -l <<< "$var * 2")")
done
printf '%s\n' "${New_array[@]}"

请注意,inputs=(12.12 34.34) 创建了一个名为 inputs 的数组,其中包含元素 12.1234.34New_array+=(...) 将一个元素(这里是命令bc -l &lt;&lt;&lt; "$var * 2" 的输出)附加到数组New_array。或者,这可以使用printf 的隐式循环和bash 的内置函数mapfile 一次性完成:

mapfile -t New_array < <(printf '%s * 2\n' "${inputs[@]}" | bc -l)

如果保证数组的元素不包含空格和全局字符(这可能是这里的情况),那么这可能是另一种方式:

New_array=($(printf '%s * 2\n' "${inputs[@]}" | bc -l))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 2013-02-27
    • 2015-01-07
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多