0

我还不是一个好的 bash 脚本编写者。

在下面的示例脚本中,我试图通过步骤,检查自步骤开始以来经过的时间量,并使用正确的单数或复数结尾来描述已经过去的时间量。

如果经过的时间四舍五入到 1 秒,我希望脚本告诉我完成该步骤需要 1“秒”,如果是 1 秒以外的其他时间,我希望它告诉我它花了x“秒”

#!\bin\bash
STEP=0
STEPS=4
RUN=1

while [ $RUN -eq 1 ]
do
    if (( RUNTIME == 1 ))
    then
      SEC="second"
    else
      SEC="seconds"
    fi


    STEP=$(( STEP + 1 ))
    printf "\\nStep $STEP/$STEPS\\n"
    printf "Hi!\\n"
    TIME=$SECONDS
    RUNTIME=$(( TIME - START_TIME ))
    printf "That took $RUNTIME $SEC\\n\\n"

    STEP=$(( STEP + 1 ))
    printf "Step $STEP/$STEPS\\n"
    printf "Hi!\\n"
    sleep 1s
    TIME1=$SECONDS
    RUNTIME=$(( TIME1 - TIME ))
    printf "That took $RUNTIME $SEC\\n\\n"

    STEP=$(( STEP + 1 ))
    printf "Step $STEP/$STEPS\\n"
    printf "Hi!\\n"
    sleep 2s
    TIME2=$SECONDS
    RUNTIME=$(( TIME2 - TIME1 ))
    printf "That took $RUNTIME $SEC\\n\\n"

    STEP=$(( STEP + 1 ))
    printf "Step $STEP/$STEPS\\n"
    printf "Hi!\\n"
    sleep 3s
    TIME3=$SECONDS
    RUNTIME=$(( TIME3 - TIME2 ))
    printf "That took $RUNTIME $SEC\\n\\n"

    END_TIME=$SECONDS
    RUNTIME=$(( END_TIME - START_TIME ))
    printf "The script took $RUNTIME $SEC to complete.\\n\\n"

    RUN=0

done
4

1 回答 1

1

大卫,如果你还没有发现问题,那更像是先有鸡还是先有蛋的问题。这意味着您根据循环开始SEC的值进行设置,而不是输出之前的当前值。处理这个问题的更好方法,而不是在循环的顶部进行计算,只是编写一个小函数,输出或基于值并将其合并到您的(如果您不在 WSL 上,则不应包含 double在格式字符串中——尽管从你的使用来看,它看起来像你)RUNTIMERUNTIMESEC"second""seconds"RUNTIMEprintf\\

你可以做一些简单的事情,比如:

#!/bin/bash

STEP=0
STEPS=4
RUN=1

secorsecs () {              ## simple sec or secs function based on $RUNTIME
    local seconds="second"  ## your base output is "second"
    if (( RUNTIME != 1 ))   ## if RUNTIME != 1
    then
        seconds+="s"        ## append an "s" to the end
    fi
    printf "%s" "$seconds"  ## output result
}

while [ $RUN -eq 1 ]
do
    STEP=$(( STEP + 1 ))
    printf "\\nStep $STEP/$STEPS\\n"
    printf "Hi!\\n"
    TIME=$SECONDS
    RUNTIME=$(( TIME - START_TIME ))
    printf "That took $RUNTIME $(secorsecs)\\n\\n"

    STEP=$(( STEP + 1 ))
    printf "Step $STEP/$STEPS\\n"
    printf "Hi!\\n"
    sleep 1s
    TIME1=$SECONDS
    RUNTIME=$(( TIME1 - TIME ))
    printf "That took $RUNTIME $(secorsecs)\\n\\n"

    STEP=$(( STEP + 1 ))
    printf "Step $STEP/$STEPS\\n"
    printf "Hi!\\n"
    sleep 2s
    TIME2=$SECONDS
    RUNTIME=$(( TIME2 - TIME1 ))
    printf "That took $RUNTIME $(secorsecs)\\n\\n"

    STEP=$(( STEP + 1 ))
    printf "Step $STEP/$STEPS\\n"
    printf "Hi!\\n"
    sleep 3s
    TIME3=$SECONDS
    RUNTIME=$(( TIME3 - TIME2 ))
    printf "That took $RUNTIME $(secorsecs)\\n\\n"

    END_TIME=$SECONDS
    RUNTIME=$(( END_TIME - START_TIME ))
    printf "The script took $RUNTIME $(secorsecs) to complete.\\n\\n"

    RUN=0

done

示例使用/输出

$ bash seconds.sh

Step 1/4
Hi!
That took 0 seconds

Step 2/4
Hi!
That took 1 second

Step 3/4
Hi!
That took 2 seconds

Step 4/4
Hi!
That took 3 seconds

The script took 6 seconds to complete.

如果您还有其他问题,请仔细查看并告诉我。

于 2018-03-01T07:35:34.673 回答