Мы не можем зависеть от параметров дней и часов, потому что через 7 дней мы получим параметр недели, а через 30 дней мы получим параметр месяца.
Поэтому лучше рассчитывать время начала службы.
#!/bin/bash
SERVICE=cassandra
SERVICE_START_TIME=`systemctl status $SERVICE | awk '/Active: active/{print $6" "$7}'`
SERVICE_UP_TIME=$(($(date +%s) - $(date -d "$SERVICE_START_TIME" +%s)))
echo "$SERVICE uptime : $SERVICE_UP_TIME"
вы можете попробовать следующий вкладыш -,но я предлагаю приведенный выше код, чтобы получить точный результат.
systemctl status cassandra | awk -F ';' '/Active: active/{print $2}' | sed -e 's/s ago/ 1/; s/s//g; s/min/ 60/; s/h ago/ 3600/; s/day/86400/; s/week/606800/; s/month/2592000/; s/ago//' | awk '{a=$1*$2;b=$3*$4;c=$a+$b;print a" sec"}'
Если вы работаете под set -u
и у вас есть переменная, которая может быть не установлена, и вам нужно проверить, пуста ли она с помощью теста -z
, тогда вы можете использовать
if [ -z "${BUILD_DATE:-}" ]; then
"${BUILD_DATE:-}"
расширится до пустой строки , если переменная BUILD_DATE
пуста или не установлена.
Использовать пустое значение по умолчанию:
if [ -z "${BUILD_DATE-}" ]; then
См. Расширение параметра в man bash
. Использование только -
означает, что пустое значение используется, когда переменная не установлена.
Версия расширения параметров хороша, но мне (трудно )запомнить. Тест с -v у меня хорошо работает в bash 5.0.3 (1 )на Raspbian Buster (Debian ).
#!/bin/bash
set -euo pipefail
a=1
if [[ -v a ]]; then echo "a is set with value $a"; else echo "a is not set"; fi
unset a
if [[ -v a ]]; then echo "a is set with value $a"; else echo "a is not set"; fi
echo "ends"
выход
a is set with value 1
a is not set
ends
Надеюсь, это поможет.