我正在编写一个接受这样的输入行的脚本
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的菜鸟
答案 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}