什么';这个bash脚本中的错误是什么?
我有一个语法错误:当我执行这个bash脚本时,文件结尾没有打印出来,我不明白为什么,有人有理由吗什么';这个bash脚本中的错误是什么?,bash,shell,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" ./
#!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
该行:
elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER
应该是:
elt=$(/usr/bin/time -f="%e" ./pi.pg $COUNTER)
这是命令替换
[编辑]数学也需要替换:
SUMA=$(($SUMA + $elt))
COUNTER2=$(($COUNTER2 + 1))
否则,计数器2将最终看起来像
1+1+1
因为在Bash中,将事物相邻放置实际上是字符串连接。行:
elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER
应该是:
elt=$(/usr/bin/time -f="%e" ./pi.pg $COUNTER)
这是命令替换
[编辑]数学也需要替换:
SUMA=$(($SUMA + $elt))
COUNTER2=$(($COUNTER2 + 1))
否则,计数器2将最终看起来像
1+1+1
因为在Bash中这样将东西相邻放置实际上是字符串连接。一些评论:
- shebang中有一个拼写错误:
#!bin/bash
表示不相等,因此如果-ne
。此外,缺少$1+n*500!=$2
,$1
的处理也不一致:$2
COUNTER=$1 while [ $COUNTER -ne $2 ]; do
- 您不需要逐个重定向每个
输出:echo
echo "$COUNTER " >> pcascript.out
echo " " >> pcascript.out echo MEDIA >> pcascript.out
分配给文字命令,而不是其输出$elt
选项产生一个前缀为-f=“%e”
的数字<代码>时间打印到标准:=
elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER
不支持浮点运算,但bash
可以是浮点运算;幻数$elt
多次使用:5
SUMA=$SUMA+$elt # ... MEDIA=$SUMA/5
- 您忘记了
之前的$
,您不需要逐个重定向每个媒体
输出:echo
echo "$COUNTER " >> pcascript.out
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
一些评论:
- shebang中有一个拼写错误:
#!bin/bash
表示不相等,因此如果-ne
。此外,缺少$1+n*500!=$2
,$1
的处理也不一致:$2
COUNTER=$1 while [ $COUNTER -ne $2 ]; do
- 您不需要逐个重定向每个
输出:echo
echo "$COUNTER " >> pcascript.out
echo " " >> pcascript.out echo MEDIA >> pcascript.out
分配给文字命令,而不是其输出$elt
选项产生一个前缀为-f=“%e”
的数字<代码>时间打印到标准:=
elt=/usr/bin/time -f="%e" ./pi.pg $COUNTER
不支持浮点运算,但bash
可以是浮点运算;幻数$elt
多次使用:5
SUMA=$SUMA+$elt # ... MEDIA=$SUMA/5
- 您忘记了
之前的$
,您不需要逐个重定向每个媒体
输出:echo
echo "$COUNTER " >> pcascript.out
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
我怀疑这与行
elt=/usr/bin/time-f=“%e.”/pi.pg$COUNTER
有关。您正在尝试获取此行的输出吗?是的,我正在尝试获取该命令的输出(使用参数执行pi.pg程序时测量时间…),我怀疑这与行elt=/usr/bin/time-f=“%e.”/pi.pg$计数器有关。您正在尝试获取这一行的输出吗?是的,我正在尝试获取该命令的输出(在使用参数执行pi.pg程序时测量时间…)SUMA和COUNTER2行也需要替换:SUMA=$($SUMA+$elt))@DavidSouther确实,谢谢您捕捉到这一点。一个let
也可以进行计算,类似于脚本的最后一行。time
将它的输出写入stderr,您还需要重定向到stdout才能工作,并删除pi.pg
的输出(如果有)elt=$(/usr/bin/time-f=“%e.”/pi.pg COUNTER 2>&1>/dev/null)
。而且pi.pg
不得向stderr写入任何内容。谢谢大家!我现在要尝试所有这些更改!SUMA和COUNTER2行也需要替换:SUMA=$($SUMA+$elt))@DavidSouther确实如此,谢谢您的关注。一个let
也可以进行计算,类似于脚本的最后一行。time
将它的输出写入stderr,您还需要重定向到stdout才能工作,并删除pi.pg
的输出(如果有)elt=$(/usr/bin/time-f=“%e.”/pi.pg COUNTER 2>&1>/dev/null)
。而且pi.pg
不得向stderr写入任何内容。谢谢大家!我现在要尝试所有这些更改!另一种重定向输出的方法是:exec>>pcascript。out@WilliamPursell:+1如果需要重定向整个脚本的stdout并修复目标,则exec>>pcascript.out
可以工作。重定向输出的另一种方法是:exec>>pcascript。out@WilliamPursell:+1,如果您需要重定向整个脚本并修复目标,然后exec>>pcascript.out
工作。