2013-10-11 49 views
0

對不起位和信息 所以我寫的平均shell腳本程序 SNIPPIT因此,如果使用輸入如何從這個回聲中提取數字到單獨的變量中?

echo 1 3, .... | sh get_number 

我將不得不從回聲是

VAR1拉用空格分隔的數字= 1,VAR2 = 3,等等

我試圖

#!/bin/sh 
sum=0 
for i in $* 
do 
sum=`expr $sum + $i` 
done 
avg=`expr $sum/$n` 
echo Average=$avg 

但不工作.... 我包括一個閱讀嗎? 也我怎麼會 sh get_number <file1>, <file2>...抓住他們的數字和總和他們在shell腳本中 ?

感謝

+0

您正在使用什麼殼呢? – chepner

+1

你在某處增加了「$ n」嗎? –

+0

'sum = $((sum + i))'應該在任何POSIX shell中工作;算術不再需要'expr'。 – chepner

回答

1

聽起來像是你正在尋找的read外殼內置:

% echo "1 2 3 4" | read a b stuff
% echo $b
2
% echo $stuff
3 4

+0

大多數shell將在單獨的進程中運行'read'命令,所以'a'和'b'在該進程退出後將不可用。 – chepner

+0

go go zsh,然後。我認爲今天的「大部分」炮彈都是內置的炮彈,但是它不是古代的登陸炮彈。無論如何,這只是教誨。讀取將是更大的shell腳本的一部分,對吧? –

+0

這是一個內置的shell,但它是誘導子shell運行'read'命令的管道。有一些例外(我認爲是'zsh','ksh','bash'和4.2+中的'lastpipe'選項),但它不是POSIX標準,因此不便攜。 – chepner

0
#!/bin/sh 

while [ $# -gt 0 ]; do 
    ((i++)) 
    ((sum += $1)) 
    shift 
done 
echo "Average=$((sum/i))" 

注意:此故障在dash這是我能找到的真正最接近殼sh

從作爲命令行參數或線路傳來的文件中讀取值的例子從標準輸入讀取:

add_to_sum() { 
    set $* 
    while [ $# -gt 0 ]; do 
     I=`expr $I + 1` 
     SUM=`expr $SUM + $1` 
     shift 
    done 
} 

I=0 
SUM=0 

if [ $# -gt 0 ]; then 
    # process any arguments on the command line 
    while [ $# -gt 0 ]; do 
     FILE=$1 
     shift 
     while read LINE; do 
      add_to_sum "$LINE" 
     done < "$FILE" 
    done 
else 
    # if no arguments on the command line, read from stdin 
    while read LINE; do 
     add_to_sum "$LINE" 
    done 
fi 

# be sure not to divide by zero 
[ $I -gt 0 ] && echo Average=`expr $SUM/$I` 
+0

不能使用bash ...我的代碼必須是sh – lifejuggler

+0

我剛剛切換到sh,它仍然在這裏工作。我會仔細檢查一下sh是不是別名。 –

+0

我檢查了兩個centos系統,並且都有相同的sh和bash shell。在一個Ubuntu系統上,sh被映射到破折號導致我的代碼失敗。在Mac OS 10.8.5 sh和bash是不同的二進制文件,代碼有效。 –

1

來修復代碼:

for i in $*; do 
    sum=$((sum + i)) 
    n=$((n + 1)) 
done 
echo "Average=$((sum/n))" 
+0

'讀'是一個紅鯡魚。我責怪我對這個問題的錯誤解釋。此外,這個答案適用於破折號,所以它可能會在任何地方工作。 –

相關問題