Используя только мощность bash, это лучшее, что я нашел до сих пор:
varnums=$(echo ${var//[^0-9]/ })
var_version=${varnums// /.}
echo $varversion
Результат будет примерно таким:
1.2.6.6.17.686
Не так уж плохо, не так ли?
Гораздо проще измерить время в секундах, начиная с эпохи ( +% s
). Затем прошедшее время в секундах получается путем простого вычитания и преобразования из секунд в Минуту просто нужно разделить на 60:
export etool_start=$(date +"%s")
do_stuff_with_etool
export etool_stop=$(date +"%s")
echo "elapsed time=$(( (etool_stop - etool_start)/60 )) minutes"
Если вам действительно нужно время в человеческой форме, вы можете преобразовать их. Использование GNU date
:
$ date -d "@$etool_start"
Tue Jul 5 21:30:19 PDT 2016
Или:
$ date -d "@$etool_start" "+%Y%m%d%H%M"
201607052130
Чтобы выразить прошедшее время в минутах в различных форматах, мы можем использовать printf
. Например, чтобы получить истекшее время с четырьмя цифрами, мы можем использовать формат % 04i
:
$ printf '%04i\n' "$(( ($etool_stop - $etool_start)/60 ))"
0001
Формат % 4i
даст нам целое число (i) в четырех символы. Если нам нужны ведущие нули вместо ведущих пробелов, мы используем % 04i
.
Если нам нужен противоположный знак для числа:
$ printf '%05i\n' "$(( ($etool_start - $etool_stop)/60 ))"
-0035
Поскольку для знака минус требуется дополнительный символ, мы увеличили выделенное пространство с 4 до 5: % 05i
.
Поскольку в приведенном выше примере использовалась арифметика bash, которая является только целочисленной. Если вы хотите, чтобы истекшее время в минутах с долями минуты, можно использовать другой инструмент, например bc
:
$ echo "($etool_stop - $etool_start)/60" | bc -l
1.38333333333333333333
Из man date
], секунды с начала эпохи определяются следующим образом:
% s
секунд с 1970-01-01 00:00:00 UTC
Поскольку это определено таким образом, местный часовой пояс не имеет значения. Следовательно, вычисление его в "местном часовом поясе" или во всемирном времени, -u
, не имеет значения:
$ date +%s; date -u +%s
1467780345
1467780345
В bash:
$ export etool_starting=`date -u +"%s"`
$ export etool_ending=`date -u +"%s"`
Если только необходимы минуты:
$ printf '%05d\n' "$(( (etool_starting - etool_ending) / 60 ))"
-0120 ### If 120 minutes have elapsed in between.