繁体   English   中英

Bash while循环,完成时<$ 1

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM