我对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;?
答案 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
不适合执行此任务。