#linux #bash #shell #unix #scripting
#linux #bash #оболочка #unix #сценарии
Вопрос:
Как я могу написать сценарий оболочки, который проверяет наличие переменной среды и записывает в файл журнала, если переменная не установлена?
Комментарии:
1. Я могу повторить $var изнутри скрипта. Либо я проверяю возвращаемую строку на наличие null и т. Д.. Это выглядит очень громоздко и хакерски..
2. также спрашивается в unix и linux
Ответ №1:
Если вам нужно сообщение только тогда, когда оно не установлено, тогда:
if [ -z "${CHOSEN_ENV_VAR}" ]
then echo "CHOSEN_ENV_VAR was not set but should have been" >> log.file
fi
Если вы просто хотите, чтобы скрипт остановился и сообщил о stderr, то:
: ${CHOSEN_ENV_VAR:?'was not set but should have been'}
(Вы можете проверить это в интерактивной оболочке, но интерактивная оболочка не завершится. Поместите это в скрипт, и скрипт завершится.)
Комментарии:
1. Я думаю, он должен опустить (2nd)
:
в вашем 2-м примере, поскольку:?
относится не только к неустановленным переменным, но и проверяет наличие нулевых переменных. Исключение двоеточия проверяет только значение unset. (Та же проблема с вашим первым примером, просто проверяет пустоту, а не отменяет установку)2. Да — мне редко, если вообще когда-либо, требовался set, но пустой env var; обычно это указывает на проблему. Вы также можете использовать трюки
[ -n "${CHOSEN_ENV_VAR X}" ]
для обнаружения неустановленной переменной среды. Обозначение генерирует X, если значение CHOSEN_ENV_VAR не задано.
Ответ №2:
Команда для записи в журнал logger
. И вы проверяете, установлена ли переменная с test -v
, поэтому в вашем скрипте у вас должны быть строки:
if test ! -v VARNAME; then logger Variable VARNAME is unset; fi
РЕДАКТИРОВАТЬ: в случае, если вы имеете в виду log только произвольный файл журнала, а не системный журнал, вы, конечно, можете заменить регистратор на echo bla bla> log.file .
Ответ №3:
[ -z "$name" ]
проверяет, является ли name
она пустой. Чтобы проверить, не установлена ли она, используйте [ -z "${name isset}" ]
.
check() {
if [ -z "${name isset}" ]; then
echo "name is unset"
elif [ -z "$name" ]; then
echo "name is empty"
else
echo "name is non-empty"
fi
}
name=me; check name
name=; check name
unset name; check name