2017-04-25 102 views
-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

因此不知何故,它不是添加。如何重新排列這些行來修復程序並擺脫「不明確的重定向」?

+0

你怎麼調用你的腳本?要麼稱之爲'./sumnum nums'或將'done <$ 1'改爲'done codeforester

+0

'cat nums | 。/ sumnums' – themightyscot

+0

腳本需要該文件作爲參數。 – karakfa

回答

0

awk來救援!

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

bash不適合這項任務。

+0

「done <」記錄在哪裏? bash中「<」的含義是什麼?它是否有一個名稱,如「重定向」,可以找到它的文檔? –

1

假設你的文件名是$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是傳統語法;不要使用它。
+0

對一個有問題的問題的很好的答案! – codeforester