Выдать ошибку при использовании пустых переменных оболочки

Иногда я использую $PROJECT_HOME/* для удаления всех файлов в проекте. Когда переменная окружения PROJECT_HOME не установлена ​​(потому что я сделал su и у нового пользователя нет этой переменной окружения), он начинает удалять все файлы из корневой папки. Это апокалиптично.

Как настроить bash на ошибку, когда я использую неопределенную переменную среды в оболочке?

3 Solutions collect form web for “Выдать ошибку при использовании пустых переменных оболочки”

В оболочке POSIX вы можете использовать set -u :

 #!/bin/sh set -u : "${UNSET_VAR}" 

или с использованием расширения параметров :

 : "${UNSET_VAR?Unset variable}" 

В вашем случае вы должны использовать :? а не ? также сбой по заданным, но пустым переменным:

 rm -rf -- "${PROJECT_HOME:?PROJECT_HOME empty or unset}"/* 
 [ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/* 

Это также уловит случай, когда PROJECT_HOME установлен, но не содержит ничего.

Пример:

1) Это удалит почти все, что вы можете удалить в своей системе (запрет dotfiles внутри / (обычно их нет)):

 set -u PROJECT_HOME= rm -r "$PROJECT_HOME"/* 

2) Это ничего не сделает:

 PROJECT_HOME= [ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/* 

Полностью удалить ваш проект домой и воссоздать его может быть другой вариант (если вы хотите избавиться от dotfiles тоже):

 #no apocalyptic threats in this scenario rm -r "$PROJECT_HOME" mkdir "$_" 

Другой способ сделать это:

 rm -r "${somevar:-/tmp/or_this_if_somevar_is_empty}"/* 

Существует много переменных подстановок, один из которых – это когда «somevar» пуст (и в этом случае он пытается удалить /tmp/or_this_if_somevar_is_empty/* )

  • глобальная Linux-оболочка linux в переменной памяти - из оболочки
  • получить переменную окружения по имени переменной?
  • Последняя неудачная команда в bash
  • Ограничение опции grep --color для интерактивной оболочки
  • Можно ли изменить оболочку, используемую для запуска приложений GUI из диспетчера рабочего стола?
  • Почему установка переменной перед командой legal в bash?
  • Что делает `env COLUMNS =% S ps ...` do?
  • Как определить, откуда появилась переменная среды
  • Использовать env с переменными окружения из файла
  • В чем разница между env, setenv, export и когда использовать?
  • Экспортировать переменную env, которая будет доступна во всех суб-оболочках, и может быть изменена?
  • Linux и Unix - лучшая ОС в мире.