それ以外の場合は、APP_ENV
「prod」は空でなければなりません。DATABASE_DISABLE_MIGRATIONS
true
〜しない限り DATABASE_DISABLE_MIGRATIONS
空またはnullです。つまり、価値は尊重されるべきです自動割り当ては、次の場合にのみ発生する必要があります。未設定。
オリジナルDATABASE_DISABLE_MIGRATIONS |
APP_ENV |
新しいDATABASE_DISABLE_MIGRATIONS |
---|---|---|
空または空 | どの | 元の価値を維持する |
長さがゼロ以外の文字列 | どの | 元の価値を維持する |
未設定 | 「製品」 | 空 |
未設定 | 空でも「prod」でもない | 「本物」 |
私はシェル(POSIX)を学び始め、次のコードを使ってこれを成功させました。
#!/bin/sh
if [ "${DATABASE_DISABLE_MIGRATIONS+set}" != set ]; then
: ${DATABASE_DISABLE_MIGRATIONS:=$( [ "$APP_ENV" = "prod" ] || echo "true" )}
fi
# Just for debug (not meant to be in the single-line assignment of course)
if [ -z "$DATABASE_DISABLE_MIGRATIONS" ]; then
echo "Empty value, migrations ENABLED"
else
echo "Not empty value, migrations DISABLED"
fi
上記のコードを1行の文で書くことはできますか?
設定されていない文字列、null、または空の文字列を考慮すると、1行の文を作成するのは簡単です。私はしばしば以下を使用します。
: ${FOO:=$( [ "$APP_ENV" = "prod" ] || echo "true" )}
変数が設定されていない場合は、nullまたは空で、「prod」でない場合はFOO
値を取得します。true
FOO
APP_ENV
たぶん似たような「ショートカット」がありませんか?
ベストアンサー1
2つの変数を使用するCaseステートメントは次のとおりです。
case "${DATABASE_DISABLE_MIGRATIONS}:${APP}" in
?*:* | "":prod) # not empty, or prod
echo "Not empty value, migrations DISABLED"
;;
*) echo "Empty value, migrations ENABLED"
;;
esac
しかし、これは「空」と「未設定」を区別しません。変数の値の1つにコロンが含まれている場合でも、なりすましの可能性があります。
に基づいて
オリジナルDATABASE_DISABLE_MIGRATIONS |
APP_ENV |
新しいDATABASE_DISABLE_MIGRATIONS |
---|---|---|
空または空 | どの | 元の価値を維持する |
長さがゼロ以外の文字列 | どの | 元の価値を維持する |
未設定 | 「製品」 | 空 |
未設定 | 空でも「prod」でもない | 「本物」 |
自分をPOSIXに制限しないでください。 「未設定」は調整変数を使用するには、次のようにします。
if [[ ! -v DATABASE_DISABLE_MIGRATIONS ]]; then
if [[ $APP == prod ]]; then
DATABASE_DISABLE_MIGRATIONS=""
else
DATABASE_DISABLE_MIGRATIONS=true
fi
fi
これは明らかにあなたの一行の希望を満たしていませんが、あなたの意図を伝える最も読みやすい方法だと思います。