Как я могу заставить переменную bash изменить слово между окончаниями в единственном и множественном числе на основе количества времени?

Я еще не хороший сценарист bash.

В следующем примере сценария я пытаюсь пройти по шагам, проверить количество времени, прошедшего с начала шага, и использовать правильное окончание в единственном или множественном числе, чтобы описать количество прошедшего времени.

Если количество времени, которое проходит, округляется до 1 секунды, я хотел бы, чтобы сценарий сказал мне, что для перехода через шаг потребовалась 1 "секунда", и если это что-то еще, кроме 1 секунды, я хотел бы, чтобы оно сообщило мне об этом. заняло х количество "секунд"

#!\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

1 ответ

Решение

Дэвид, если ты еще не нашел проблему, это больше проблема курицы или яйца. То есть вы устанавливаете SEC основанный на значении RUNTIME в начале цикла, в отличие от текущего значения RUNTIME непосредственно перед выходом. Лучший способ справиться с этим, а не вычисления SEC в верхней части цикла, просто написать небольшую функцию, которая выводит либо "second" или же "seconds" основанный на значении RUNTIME и включить это в ваш printf (который, если вы не на WSL, не должен включать двойной \\ в пределах строки формата - хотя от вашего использования, похоже, что вы)

Вы можете сделать что-то простое, как:

#!/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.

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

Другие вопросы по тегам