Linux – bash脚本来计算已用时间

我在bash中编写脚本来计算执行我的命令所用的时间,请考虑:

STARTTIME=$(date +%s) #command block that takes time to complete... #........ ENDTIME=$(date +%s) echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..." 

我想我的逻辑是正确的,但我最终打印出以下内容:

“完成这个任务需要几秒钟的时间……”

任何错误的我的string评价?

我相信bashvariables是无types的,如果在bash中有一个“string到整数”的方法,我会喜欢。

$(())$[]可以用来计算算术运算的结果。 你正在使用$() ,它只是简单地把string作为一个命令来评估。 这是一个微妙的区别。 希望这可以帮助。

正如在这个答案的评论中指出的叮叮当, $[]已被弃用, $(())应该受到青睐。

我发现使用内部variables“$ SECONDS”非常干净

SECONDS=0 ; sleep 10 ; echo $SECONDS

您正试图在ENDTIME执行该号码作为命令。 您还应该看到类似1370306857: command not found的错误1370306857: command not found 。 而是使用算术扩展 :

 echo "It takes $(($ENDTIME - $STARTTIME)) seconds to complete this task..." 

您也可以将这些命令保存在单独的脚本中, commands.sh ,并使用time命令:

 time commands.sh 

您可以在这里使用Bash的time关键字和一个适当的格式string

 TIMEFORMAT='It takes %R seconds to complete this task...' time { #command block that takes time to complete... #........ } 

以下是关于TIMEFORMAT

该参数的值用作格式string,指定如何显示以time保留字为前缀的pipe道的时间信息。 ' % '字符引入了一个扩展为时间值或其他信息的转义序列。 转义序列及其含义如下: 大括号表示可选部分。

 %% A literal '%'. %[p][l]R The elapsed time in seconds. %[p][l]U The number of CPU seconds spent in user mode. %[p][l]S The number of CPU seconds spent in system mode. %P The CPU percentage, computed as (%U + %S) / %R. 

可选的p是一个指定精度的数字,小数点后的小数位数。 值为0不会导致输出小数点或分数。 最多可以指定小数点后三位; 大于3的p值变为3.如果未指定p ,则使用值3。

可选的l指定MMmSS.FFs格式的更长格式(包括分钟) p的值决定是否包含分数。

如果这个variables没有设置,Bash的行为就好像它有价值

 $'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' 

如果该值为空,则不显示定时信息。 显示格式string时会添加尾随的换行符。

试试下面的代码:

 start=$(date +'%s') && sleep 5 && echo "It took $(($(date +'%s') - $start)) seconds" 

尝试使用经过秒选项的时间:

/usr/bin/time -f%e sleep 1在bash下。

或交互式bash中的\time -f%e sleep 1

请参阅时间手册页:

bash shell的用户需要使用显式path才能运行外部时间命令,而不是shell内置variables。 在/ usr / bin中安装时间的系统上,第一个示例将成为/ usr / bin / time wc / etc / hosts

 FORMATTING THE OUTPUT ... % A literal '%'. e Elapsed real (wall clock) time used by the process, in seconds. 
  #!/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 
 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