Bash 将行中 2 个单词的数字相加



我正在制作一个接受这样一行输入的脚本

 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 的菜鸟

这是

获取第一个字符之后的所有行:

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

我认为你想要更多的东西:

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

我认为你对自己太苛刻了。由于您将冒号用作名称和数字之间的分隔符,因此请将其用作 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}

相关内容

  • 没有找到相关文章

最新更新