Bash从2个单词中添加数字

时间:2015-04-27 06:48:33

标签: linux bash shell unix

我正在编写一个接受这样的输入行的脚本

 Dave: 1 2 3 

并在终端

中输出此格式的数字之和
 Dave: 6

一切都很好,除非第一个单词是数字......在某些情况下。如果数字是1位数,则输出符合预期。即:

 1: 1 2

输出

 1: 3

但如果该行中的第一个单词是一个2位数字,并且最低有效但不等于0,则该脚本将该值合并到总和中。例如:

 12: 1 2 3

变为:

 12: 8

因为最低有效值'2'也被添加到总和中。

这是我的代码,我突出了有问题的一行。

#!/bin/bash
filename=/dev/stdin
sum1=0;
re='^[0-9]+$'


if [ $# -gt 0 ] ; then
    if [ -e $1 ] ; then
        filename=$1
    else
        filename=/dev/stdin
    fi
fi

#sed '/^$/d' $filename

while read line ; do    

    name=$(echo $line | cut -d ' ' -f 1)
#   numbers=$(echo $line | wc -w)

    if [[ $name =~ $re ]] ; then
        #VVVVV PROBLEMATIC LINE
       numbers="${line[@]:1}"
       ^^^^ PROBLEMATIC LINE
       for i in $numbers; do
            sum1=$(($sum1+$i))
       done

        printf $line
        echo ' '$sum1
        sum1=0
    else

        for p in $line ; do
            #echo $line
            sum1=$(($sum1+$p))

        done
    #print first word of line here!
        if [ "$line" != "" ] ; then 

            printf $line 
            echo ' '$sum1
        fi    
        sum1=0
    fi
done < $filename

对不起,如果我的代码不好,我是Bash的菜鸟

2 个答案:

答案 0 :(得分:0)

这是获得第一个字符后的所有行:

   numbers="${line[@]:1}"

我想你想要更像的东西:

numbers=$(echo $line | cut -d ' ' -f 2-)

答案 1 :(得分:0)

我认为你在自己身上做得太难了。由于冒号是名称和数字之间的分隔符,因此将其用作cut的分隔符。 只要冒号后的所有内容都是数字,就不需要正则表达式。

试试这个:

#!/usr/bin/env bash

if [[ $# -ge 1 && -f $1 ]]; then
    filename=$1
else
    filename=/dev/stdin
fi

while read line; do

    name=$(echo $line | cut -d ':' -f 1)
    numbers=$(echo $line | cut -d ':' -f 2)

    declare -i sum=0
    for n in ${numbers}; do
        (( sum += n ))
    done

    echo ${name}: ${sum}

done < ${filename}