使用空 shell 变量时出现错误

使用空 shell 变量时出现错误

有时我使用,$PROJECT_HOME/*删除项目中的所有文件。当PROJECT_HOME未设置环境变量时(因为我设置了su并且新用户没有设置此环境变量),它开始从根文件夹中删除所有文件。这是世界末日。

bash当我在 shell 中使用未定义的环境变量时,如何配置抛出错误?

答案1

在 POSIX shell 中,您可以使用设置-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/*

相关内容