2012-02-27 81 views
1

我有語法錯誤:當我執行這個bash腳本時,不期望打印出文件結尾,我不明白爲什麼,有沒有人有理由?這個bash腳本中的錯誤是什麼?

#!bin/bash 
COUNTER=$1 
while [ $COUNTER -ne $2 ]; do 
    echo "$COUNTER " >> pcascript.out 
    COUNTER2=0 
    SUMA=0 
    while [ $COUNTER2 -lt 5 ]; do  
     elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER 
     SUMA=$SUMA+$elt 
     COUNTER2=$COUNTER2+1 
    done 
    MEDIA=$SUMA/5 
    echo " " >> pcascript.out 
    echo MEDIA >> pcascript.out 
    let COUNTER=$COUNTER+500 
done 
+0

我' d懷疑它與行'elt =/usr/bin/time -f =「%e」./pi.pg $ COUNTER'有關。你想要得到這條線的輸出嗎? – 2012-02-27 19:32:16

+0

是的,我試圖得到該命令的輸出(用參數執行pi.pg程序時測量的時間...) – c4sh 2012-02-27 19:37:25

回答

3

一些評論:

  • 存在的家當一個錯字:

    #!bin/bash 
    
  • -ne意味着不相等,因此該循環很容易成爲如果$1 + n*500 != $2無限。也下落不明$1$2不被一致地處理:

    COUNTER=$1 
    while [ $COUNTER -ne $2 ]; do 
    
  • 你不需要一個給每個echo輸出重定向一個:

    echo "$COUNTER " >> pcascript.out 
    
  • $elt分配給文字的命令,而不是它的輸出。 -f="%e"選項產生一個前綴爲=的數字; time打印到stderr:

    elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER 
    
  • bash不支持浮點運算,但$elt可以漂浮;幻數5多次使用:

     SUMA=$SUMA+$elt 
        # ... 
    MEDIA=$SUMA/5 
    
  • MEDIA之前忘記$,你不需要一個給每個echo輸出一個重定向:

    echo " " >> pcascript.out 
    echo MEDIA >> pcascript.out 
    

下面是一個嘗試的腳本解決上面列舉的問題:

#!/bin/sh 
# Find average time it takes to run ./pi.pg $i over several repetitions 
set -e 
# for i in [$1..$2) 
i=${1:?} 
while [ $i -lt ${2:?} ]; do 
    total=0 
    j=0 
    while [ $j -lt 5 ]; do 
     t=$(/usr/bin/time -f'%e' ./pi.pg $i 2>&1 >/dev/null) 
     total=$(echo "$total + $t" | bc) 
     j=$(($j + 1)) 
    done 
    mean=$(echo "scale=2; $total/$j" | bc) 
    echo "$i $mean" 
    i=$(($i + 500)) 
done >>pcascript.out 
# or you could redirect the whole script ./measure-time >>pcascript.out instead 
+1

重定向輸出的另一種方法是:exec >> pcascript.out – 2012-02-28 03:56:16

+0

@William Pursell:如果您需要重定向整個腳本的stdout並修復目標,然後執行'exec >> pcascript.out',則爲+1。 – jfs 2012-02-29 07:58:51

3

線:

elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER 

應該是:

elt=$(/usr/bin/time -f="%e" ./pi.pg $COUNTER) 

這是命令替換。

[編輯]數學也需要被取代:

SUMA=$(($SUMA + $elt)) 
COUNTER2=$(($COUNTER2 + 1)) 

否則,COUNTER2最終會看起來像

1+1+1 

如把東西旁邊的海誓山盟一樣,在擊實際上是字符串連接。

+0

SUMA和COUNTER2線也需要替換: SUMA = $(($ SUMA + $ elt)) – 2012-02-27 20:00:55

+0

@DavidSouther的確,感謝您也瞭解這一點。 「let」也可以用來做數學,類似於劇本的最後一行。 – JRFerguson 2012-02-27 20:14:34

+1

'time'將它的輸出寫入到stderr,你還需要重定向到stdout以使其工作並丟棄'pi.pg'的輸出(如果有的話)'elt = $(/ usr/bin/time - f =「%e」./pi.pg $ COUNTER 2>&1>/dev/null)'。而且'pi.pg'不能寫任何東西給stderr。 – 2012-02-27 20:14:34