Как я могу заставить переменную 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.
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.