什么';这个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" ./

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

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
工作。