在Bash脚本中找到一串数字的总和?

时间:2018-10-30 12:43:43

标签: linux bash

到目前为止,我有这个脚本:

#!/bin/sh
echo type in some numbers:
read input

从这里开始,我陷入困境。假设input=30790148。我想做的是将所有这些整数加起来得到3 + 0 + 7 + 9 + 0 + 1 + 4 + 8 = 32。我该怎么做?

5 个答案:

答案 0 :(得分:3)

不使用外部工具的另一种方法:

read -p "Type some number: " num
for((i=0;i<${#num};i++)); do ((sum+=${num:i:1})); done

echo "$sum"

答案 1 :(得分:1)

有两个核心实用程序foldpaste,您可以在此处使用(为input=12345进行说明):

fold -w1 <<< $input | paste -sd+ - | bc
  • fold -w1将输入行换成1个字符的宽度:

    $ fold -w1 <<< $input
    1
    2
    3
    4
    5
    
  • paste -sd+ -按顺序(-s)将输入与+分隔符(-d+)合并为一行,即从标准输入中读取(最后一个-;对于GNU paste是可选的):

    $ fold -w1 <<< $input | paste -sd+ -
    1+2+3+4+5
    
  • bc然后计算总和:

    $ fold -w1 <<< $input | paste -sd+ - | bc
    15
    

答案 2 :(得分:0)

这个awk单线可能会帮助您:

awk '{for(i=1;i<=NF;i++)s+=$i}END{print s}' FS="" <<< yourString

例如:

kent$  awk '{for(i=1;i<=NF;i++)s+=$i}END{print s}' FS=""<<< "123456789" 
45     

答案 3 :(得分:0)

此人使用sedbc

echo "12345" | sed -e 's/\(.\)/\1\+0/g' | bc

尽管+0不直观,但还是有点怪癖

编辑:使用@PaulHodges的答案中的&,它可以简化为:

echo "12345" | sed 's/./&+0/g' | bc

答案 4 :(得分:0)

使用sedbc-

input=30790148; echo $input | sed 's/[0-9]/&+/g; s/$/0/;' | bc

如果您没有GNU sed,则可能需要换行而不是使用分号。

input=30790148;
echo $input | 
  sed '
     s/[0-9]/&+/g
      s/$/0/
  ' | bc