[英]Bash while loop with done < $1
我对done < $1
表示感到困惑。
我正在尝试编写一个程序“ sumnums”,该程序读取具有几行数字的名为“ nums”的文件。 然后应打印出数字行,然后是所有数字的总和。
目前我有:
#!/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
。
因此,它没有添加。 如何重新排列这些行以修复程序并摆脱“歧义重定向”?
假设文件名在$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
是实际消耗文件内容的命令。 它可以是有意义的标准输入重定向到一个for
循环,但只有在该循环里面的东西是从标准输入读取。 $(( ))
是现代POSIX sh算术语法。 expr
是旧式语法; 不要使用它。 awk
解救!
awk '{for(i=1;i<=NF;i++) sum+=$i} END{print "Total sum is: " sum}' file
bash
不是执行此任务的正确工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.