빈 쉘 변수를 사용할 때 오류가 발생했습니다.

빈 쉘 변수를 사용할 때 오류가 발생했습니다.

$PROJECT_HOME/*때로는 프로젝트의 모든 파일을 사용하고 삭제합니다. PROJECT_HOME환경 변수가 설정되지 않은 경우 (내가 설정했고 su새 사용자가 이 환경 변수를 설정하지 않았기 때문에) 루트 폴더에서 모든 파일이 삭제되기 시작합니다. 이것이 세상의 종말이다.

bash셸에서 정의되지 않은 환경 변수를 사용할 때 발생하는 오류를 어떻게 구성합니까?

답변1

POSIX 쉘에서는 다음을 사용할 수 있습니다.U를 설정:

#!/bin/sh

set -u
: "${UNSET_VAR}"

또는 사용매개변수 확장:

: "${UNSET_VAR?Unset variable}"

귀하의 경우에는 설정되었지만 비어 있는 변수에 대해서도 실패를 :?대신 사용해야 합니다 .?

rm -rf -- "${PROJECT_HOME:?PROJECT_HOME empty or unset}"/*

답변2

[ -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 "$_" 

답변3

이를 수행하는 또 다른 방법:

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

변수 대체가 많이 있습니다. 위의 대체는 "somevar"가 비어 있는 경우입니다(이 경우 삭제를 시도합니다 /tmp/or_this_if_somevar_is_empty/*).

관련 정보