2017-04-25 32 views
-1

私はdone < $1表記で少し混乱しています。

私は数字の数行を持つ "nums"と呼ばれるファイルを読み込むプログラム "sumnums"を書こうとしています。次に、数字の行に続いてすべての数字の合計を出力する必要があります。その後、Total sum is: 0を出力し、

#!/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" 

、それはその後、 ./sumnums: line 10: $1: ambiguous redirectは言う正しくNUMSから番号のリストを出力します

現在、私は持っています。

何とか追加していません。プログラムを修正して "あいまいなリダイレクト"を取り除くには、これらの行をどのように並べ替えるのですか?

+0

スクリプトをどのように呼び出すのですか? './sumum 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は(この文脈では)ファイルから実際にコンテンツを消費するコマンドなので、これは不可欠です。 の場合、stdinをforループにリダイレクトするのは意味がありますが、そのループ内の何かがstdinから読み取っている場合に限ります。
  • $(())は、最新のPOSIX sh算術構文です。 exprは従来の構文です。それを使用しないでください。
+0

iffy質問にすばらしい答え! – codeforester