Bash while循环完成< $ 1

时间:2017-04-25 01:24:08

标签: bash while-loop

我对done < $1符号感到有些困惑。

我正在尝试编写一个程序&#34; sumnums&#34;它读入一个名为&#34; nums&#34;的文件。有几排数字。然后它应该打印出数字的行,然后是所有数字的总和。

目前我有:

#!/bin/bash
sum=0;
while read myline
do  
  echo "Before for; Current line: \"$myline\""
done
for i in $myline; do  
  sum=$(expr $sum + $i)
done < $1    
echo "Total sum is: $sum"

然后正确输出nums中的数字列表然后说 ./sumnums: line 10: $1: ambiguous redirect,然后输出Total sum is: 0

所以不知何故它没有添加。如何重新排列这些行以修复程序并摆脱&#34;模糊重定向&#34;?

2 个答案:

答案 0 :(得分:2)

假设您的文件名位于$1(也就是说,您的脚本是使用./yourscript nums调用的):

#!/bin/bash

[[ $1 ]] || set -- nums  ## use $1 if already set; otherwise, override with "nums"

sum=0
while read -r i; do      ## read from stdin (which is redirected by < for this loop)
  sum=$(( sum + i ))     ## ...treat what we read as a number, and add it to our sum
done <"$1"               ## with stdin reading from $1 for this loop
echo "Total sum is: $sum"

如果$1不包含您的文件名,请使用 包含您的文件名的内容,或者仅对实际文件名进行硬编码。

注意:

  • <"$1"适用于while read循环。这是必不可少的,因为read(在此上下文中)是实际使用文件内容的命令。 可以将stdin重定向到for循环是有意义的,但前提是该循环内的某些东西是从stdin读取的。
  • $(( ))是现代POSIX sh算术语法。 expr是遗留语法;不要使用它。

答案 1 :(得分:0)

awk救援!

awk '{for(i=1;i<=NF;i++) sum+=$i} END{print "Total sum is: " sum}' file

bash不适合执行此任务。