Bash проверяет, установлена ​​ли переменная с помощью -z при наличии `set -u`?

Мы не можем зависеть от параметров дней и часов, потому что через 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"}'
1
28.04.2020, 13:46
3 ответа

Если вы работаете под set -uи у вас есть переменная, которая может быть не установлена, и вам нужно проверить, пуста ли она с помощью теста -z, тогда вы можете использовать

if [ -z "${BUILD_DATE:-}" ]; then

"${BUILD_DATE:-}"расширится до пустой строки , если переменная BUILD_DATEпуста или не установлена.

6
19.03.2021, 02:21

Использовать пустое значение по умолчанию:

if [ -z "${BUILD_DATE-}" ]; then

См. Расширение параметра в man bash. Использование только -означает, что пустое значение используется, когда переменная не установлена.

3
19.03.2021, 02:21

Версия расширения параметров хороша, но мне (трудно )запомнить. Тест с -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

Надеюсь, это поможет.

1
19.03.2021, 02:21

Теги

Похожие вопросы