web-dev-qa-db-ja.com

空のシェル変数を使用するとエラーが発生する

時々私は、$PROJECT_HOME/*プロジェクト内のすべてのファイルを削除します。環境変数、PROJECT_HOMEが設定されていない(私がsuを実行したため、新しいユーザーにはこの環境変数が設定されていないため)、ルートフォルダーからすべてのファイルの削除が開始されます。これは終末論的です。

シェルで未定義の環境変数を使用するときに、エラーをスローするようにbashを構成するにはどうすればよいですか?

25
user93868

POSIXシェルでは、 set - を使用できます。

#!/bin/sh

set -u
: "${UNSET_VAR}"

または Parameter Expansion を使用:

: "${UNSET_VAR?Unset variable}"

あなたの場合、:? の代わりに ?も設定で失敗しますが、変数は空です:

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

これは、PROJECT_HOMEis設定されていますが、何も含まれていません。

例:

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
PSkocik

これを行う別の方法:

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

多くの変数置換があり、上記は「somevar」が空の場合です(その場合、/tmp/or_this_if_somevar_is_empty/*を削除しようとします)

0
Olivier Dulac