Как войти, если переменная среды не установлена?

#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