単一行シェルの割り当てが、変数が設定されていない場合にのみ該当します(nullまたは空の値を考慮)。

単一行シェルの割り当てが、変数が設定されていない場合にのみ該当します(nullまたは空の値を考慮)。

それ以外の場合は、APP_ENV「prod」は空でなければなりません。DATABASE_DISABLE_MIGRATIONStrue 〜しない限り 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値を取得します。trueFOOAPP_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

これは明らかにあなたの一行の希望を満たしていませんが、あなたの意図を伝える最も読みやすい方法だと思います。

おすすめ記事