Я пишу скрипт на bash, чтобы рассчитать время, затраченное на выполнение моих команд, считаем:
STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."
Я думаю, что моя логика правильная, однако я в конечном итоге с следующее распечатать:
"это займет всего несколько секунд, чтобы выполнить эту задачу...и"
Ничего плохого с моей оценкой строку?
Я считаю, переменные bash не имеют типа, я бы с удовольствием, если есть "и String в integer" и способ в bash, тем не менее.
Или $(())
или $[]
будет работать для вычисления результата арифметической операции. Вы're, используя $ ()
, который просто принимает строку и оценивая ее как команду. Это'ы немного тонкое различие. Надеюсь, что это помогает.
Как Тинк указал в комментарии на этот ответ, $[]
является устаревшим, и $(())
следует отдавать предпочтение.
Вы пытаетесь выполнить номер в ENDTIME
как команду. Вы должны также видеть ошибки вроде 1370306857: команда не найдена
. Вместо того, чтобы использовать расширение арифметики:
echo "It takes $(($ENDTIME - $STARTTIME)) seconds to complete this task..."
Вы также можете сохранить эти команды в отдельный скрипт, `commands.sh и использовать команду Время:
time commands.sh
Вы можете использовать bash'ы время
ключевое слово здесь соответствующую строку формата
TIMEFORMAT='It takes %R seconds to complete this task...'
time {
#command block that takes time to complete...
#........
}
Здесь'ы что ссылка говорит об timeformat компонента`:
значение этого параметра используется в качестве строки форматирования, определяющих, как время для трубопроводов с префиксом "время" зарезервированное слово должно быть отображено. Знак ‘%` представляет собой escape-последовательность, которая преобразуется в значение времени или другую информацию. escape-последовательности и их описания; подтяжки обозначения необязательных частей.
%%
В буквальном ‘%’. %[П][Л]Р
затраченное время в секундах. %[п][л]у
количество секунд времени процессора в режиме пользователя. %[П][Л]Ы
количество секунд времени процессора в системном режиме. %П
процент загрузки CPU, вычисляется как (%U + %S) и / %Р.
дополнительного не является цифрой с указанием точности, число цифр в дробной части после десятичной точки. Значение 0 не вызывает десятичная точка или доля должны быть выведены. В трех местах после десятичная точка может быть определена; значений не превышает 3 изменены К 3. Если я не указан, значение 3 используется.
факультативный " л " указывает более длительный формат, в том числе протоколов, из MMmSS форма.ОФС. Значение и определяет, является ли или не В долю входит.
если эта переменная не задана, Баш действует, как если бы он имел значение
и GT; $'\nreal\Т%3lR\ппользователь\Т%3lU\nsys\Т%3lsбыл' если значение равно null, нет информации о времени отображается. Пустую строку добавляется при отображении строки форматирования.
Попробуйте следующий код:
start=$(date +'%s') && sleep 5 && echo "It took $(($(date +'%s') - $start)) seconds"
попробуйте использовать время с прошедшего секунд:
/usr/Бен/времени-F%Е спать 1
под Баш.
или `\времени-F%Е спать 1 в интерактивной Баш.
смотрите страницу времени человек:
пользователи из оболочки Bash нужно использовать явный путь для запуска внешней команды Время и не раковины встроенные вариант. В системе где время устанавливается в /usr/bin, то первым примером станет /usr/Бен/время туалет /и т. д./хостов
и
FORMATTING THE OUTPUT
...
% A literal '%'.
e Elapsed real (wall clock) time used by the process, in
seconds.
Для большого количества, мы хотим распечатать в удобочитаемом формате. Пример ниже делает так же как и другие, а также принты в " формате;человека" в:
secs_to_human() {
if [[ -z ${1} || ${1} -lt 60 ]] ;then
min=0 ; secs="${1}"
else
time_mins=$(echo "scale=2; ${1}/60" | bc)
min=$(echo ${time_mins} | cut -d'.' -f1)
secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
fi
echo "Time Elapsed : ${min} minutes and ${secs} seconds."
}
Простое тестирование:
secs_to_human "300"
secs_to_human "305"
secs_to_human "59"
secs_to_human "60"
secs_to_human "660"
secs_to_human "3000"
Выход:
Time Elapsed : 5 minutes and 0 seconds.
Time Elapsed : 5 minutes and 5 seconds.
Time Elapsed : 0 minutes and 59 seconds.
Time Elapsed : 1 minutes and 0 seconds.
Time Elapsed : 11 minutes and 0 seconds.
Time Elapsed : 50 minutes and 0 seconds.
Для использования в скрипте, как описано в других постах (пункт Начать запись, затем вызвать функцию с окончания:
start=$(date +%s)
# << performs some task here >>
secs_to_human "$(($(date +%s) - ${start}))"
start=$(date +%Y%m%d%H%M%S);
for x in {1..5};
do echo $x;
sleep 1; done;
end=$(date +%Y%m%d%H%M%S);
elapsed=$(($end-$start));
ftime=$(for((i=1;i<=$((${#end}-${#elapsed}));i++));
do echo -n "-";
done;
echo ${elapsed});
echo -e "Start : ${start}\nStop : ${end}\nElapsed: ${ftime}"
Start : 20171108005304
Stop : 20171108005310
Elapsed: -------------6
#!/bin/bash
time_elapsed(){
appstop=$1; appstart=$2
ss_strt=${appstart:12:2} ;ss_stop=${appstop:12:2}
mm_strt=${appstart:10:2} ;mm_stop=${appstop:10:2}
hh_strt=${appstart:8:2} ; hh_stop=${appstop:8:2}
dd_strt=${appstart:6:2} ; dd_stop=${appstop:6:2}
mh_strt=${appstart:4:2} ; mh_stop=${appstop:4:2}
yy_strt=${appstart:0:4} ; yy_stop=${appstop:0:4}
if [ "${ss_stop}" -lt "${ss_strt}" ]; then ss_stop=$((ss_stop+60)); mm_stop=$((mm_stop-1)); fi
if [ "${mm_stop}" -lt "0" ]; then mm_stop=$((mm_stop+60)); hh_stop=$((hh_stop-1)); fi
if [ "${mm_stop}" -lt "${mm_strt}" ]; then mm_stop=$((mm_stop+60)); hh_stop=$((hh_stop-1)); fi
if [ "${hh_stop}" -lt "0" ]; then hh_stop=$((hh_stop+24)); dd_stop=$((dd_stop-1)); fi
if [ "${hh_stop}" -lt "${hh_strt}" ]; then hh_stop=$((hh_stop+24)); dd_stop=$((dd_stop-1)); fi
if [ "${dd_stop}" -lt "0" ]; then dd_stop=$((dd_stop+$(mh_days $mh_stop $yy_stop))); mh_stop=$((mh_stop-1)); fi
if [ "${dd_stop}" -lt "${dd_strt}" ]; then dd_stop=$((dd_stop+$(mh_days $mh_stop $yy_stop))); mh_stop=$((mh_stop-1)); fi
if [ "${mh_stop}" -lt "0" ]; then mh_stop=$((mh_stop+12)); yy_stop=$((yy_stop-1)); fi
if [ "${mh_stop}" -lt "${mh_strt}" ]; then mh_stop=$((mh_stop+12)); yy_stop=$((yy_stop-1)); fi
ss_espd=$((10#${ss_stop}-10#${ss_strt})); if [ "${#ss_espd}" -le "1" ]; then ss_espd=$(for((i=1;i<=$((${#ss_stop}-${#ss_espd}));i++)); do echo -n "0"; done; echo ${ss_espd}); fi
mm_espd=$((10#${mm_stop}-10#${mm_strt})); if [ "${#mm_espd}" -le "1" ]; then mm_espd=$(for((i=1;i<=$((${#mm_stop}-${#mm_espd}));i++)); do echo -n "0"; done; echo ${mm_espd}); fi
hh_espd=$((10#${hh_stop}-10#${hh_strt})); if [ "${#hh_espd}" -le "1" ]; then hh_espd=$(for((i=1;i<=$((${#hh_stop}-${#hh_espd}));i++)); do echo -n "0"; done; echo ${hh_espd}); fi
dd_espd=$((10#${dd_stop}-10#${dd_strt})); if [ "${#dd_espd}" -le "1" ]; then dd_espd=$(for((i=1;i<=$((${#dd_stop}-${#dd_espd}));i++)); do echo -n "0"; done; echo ${dd_espd}); fi
mh_espd=$((10#${mh_stop}-10#${mh_strt})); if [ "${#mh_espd}" -le "1" ]; then mh_espd=$(for((i=1;i<=$((${#mh_stop}-${#mh_espd}));i++)); do echo -n "0"; done; echo ${mh_espd}); fi
yy_espd=$((10#${yy_stop}-10#${yy_strt})); if [ "${#yy_espd}" -le "1" ]; then yy_espd=$(for((i=1;i<=$((${#yy_stop}-${#yy_espd}));i++)); do echo -n "0"; done; echo ${yy_espd}); fi
echo -e "${yy_espd}-${mh_espd}-${dd_espd} ${hh_espd}:${mm_espd}:${ss_espd}"
#return $(echo -e "${yy_espd}-${mh_espd}-${dd_espd} ${hh_espd}:${mm_espd}:${ss_espd}")
}
mh_days(){
mh_stop=$1; yy_stop=$2; #also checks if it's leap year or not
case $mh_stop in
[1,3,5,7,8,10,12]) mh_stop=31
;;
2) (( !(yy_stop % 4) && (yy_stop % 100 || !(yy_stop % 400) ) )) && mh_stop=29 || mh_stop=28
;;
[4,6,9,11]) mh_stop=30
;;
esac
return ${mh_stop}
}
appstart=$(date +%Y%m%d%H%M%S); read -p "Wait some time, then press nay-key..." key; appstop=$(date +%Y%m%d%H%M%S); elapsed=$(time_elapsed $appstop $appstart); echo -e "Start...: ${appstart:0:4}-${appstart:4:2}-${appstart:6:2} ${appstart:8:2}:${appstart:10:2}:${appstart:12:2}\nStop....: ${appstop:0:4}-${appstop:4:2}-${appstop:6:2} ${appstop:8:2}:${appstop:10:2}:${appstop:12:2}\n$(printf '%0.1s' "="{1..30})\nElapsed.: ${elapsed}"
exit 0
-------------------------------------------- return
Wait some time, then press nay-key...
Start...: 2017-11-09 03:22:17
Stop....: 2017-11-09 03:22:18
==============================
Elapsed.: 0000-00-00 00:00:01