这个bash脚本中的错误是什么?

时间:2012-02-27 19:15:49

标签: bash shell

我有语法错误:当我执行这个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

2 个答案:

答案 0 :(得分: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

因为在Bash中将事物放在彼此旁边是有效的字符串连接。

答案 1 :(得分:3)

一些意见:

  • shebang有一个拼写错误:

    #!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可以是float;幻数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