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

Я полагаю, что имя хоста хранится в переменной среды (названный ИМЕНЕМ ХОСТА: <). Это, вероятно, не обновляется динамично. Однако это, как предполагается, обновляет при перезапуске удара.
Можно также проверить, было ли имя хоста на самом деле изменено путем выполнения программы hostname, действительно?)

23
08.06.2015, 23:45
3 ответа

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

#!/bin/sh

set -u
: "${UNSET_VAR}"

или использовать Parameter Expansion:

: "${UNSET_VAR?Unset variable}"

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

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

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

Пример:

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

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

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

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

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

#no apocalyptic threats in this scenario
rm -r "$PROJECT_HOME"
mkdir "$_" 
17
27.01.2020, 19:41

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

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

Есть много подстановок переменных, одна выше - когда somevar пусто (и в этом случае он пытается удалить / tmp / or_this_if_somevar_is_empty / * )

0
27.01.2020, 19:41

Теги

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