【问题标题】:bash: how to sum up spaced number from read command?bash:如何总结读取命令中的间隔数?
【发布时间】:2020-10-13 06:42:15
【问题描述】:

例如:

#!/bin/bash

printf '%s' "write 4 numbers separated by spaces:"

read -r var

# suppose to print sum of calculated numbers, in this case I want to calculate like this:
# ((1n*2n)+(3n*4n))/2 <----divided by (total item/2)

exit 0

所以,假设我们在执行代码时输入了 4 个数字,让我们输入11 22 33 44.4,然后输入enter,然后如果我没记错的话,我们得到853.6

【问题讨论】:

    标签: printf echo user-input calc


    【解决方案1】:

    缺乏对 real 数字计算的内置支持,但有很多 options

    从那长长的列表中我选择了,因为它是我喜欢的那个:

    #!/bin/bash
    
    wanted_numbers=4
    read -p "write ${wanted_numbers} numbers separated by spaces: " line
    #echo "debug: line >$line<" >&2
    
    result=0
    numbers=0
    
    while read var
    do
        #echo "debug: got >$var<" >&2
        result=$(bc <<< "${result}+${var}")
        numbers=$((numbers + 1))
    done < <(tr ' ' '\n' <<< $line)
    
    if [[ $numbers != $wanted_numbers ]]; then
        echo "I asked for ${wanted_numbers} numbers and got ${numbers}. Try again..." >&2
        exit 1
    fi
    
    echo $result
    

    从这里开始,您可以使用${result} 做任何您需要做的事情。如果您需要用实数进行除法, 是您的朋友。

    其中最棘手的部分是您在done &lt; &lt;(...) 中看到的process substitution,它能够在while 循环中设置变量,否则将是一个子shell,并在循环外提供结果。

    【讨论】:

    • 再次嗨@TedLyngmo,我的朋友,我从你那里得到了一个更早的答案,我实际上是用粗略的方式自己做的,但这个答案证明了它的领先一步。等不及明天测试了。
    • @AhiungLim 哦,我没有注意到我们刚刚一起解决了一个问题。我希望这个也能成功! :-)
    • 我的朋友,您的回答非常完美,但仅限于 4 个或预先描述的数字。但没关系,因为我的帖子没有说any 数字,这回答了我最初的问题。看到#echo 之类的新事物让我感到惊讶,我认为那部分是评论,但事实并非如此,而且我不知道结果如何。我计算间隔数的版本是here,我使用了数组技术和其他基本的东西来实现它。
    • @AhiungLim 如果我觉得如果未注释它可能会提供一些额外的信息,我有时会在我的答案中将代码放在#comments 中。只需删除以# 开头的所有行(第一行除外)。是的,它根据“write 4 numbers”工作。我误解了那部分吗?
    • 啊,我现在看到这是一个代码,但由于它只是在测试值时需要而被注释掉,我认为整行都在做其他事情,但我很傻。你没有误解任何事情,只是我解释的方式并不完整。我的朋友,下一个问题见,祝你有美好的一天。
    猜你喜欢
    • 2017-04-11
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多