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