我正在制作一个接受这样一行输入的脚本
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}