bash を使用して環境変数が存在し、true であるかどうかをチェックし、環境変数の有効性をテストするにはどうすればよいですか?

bash を使用して環境変数が存在し、true であるかどうかをチェックし、環境変数の有効性をテストするにはどうすればよいですか?

true環境変数が定義されていて、その値が0falseまたは と異なるかどうかを返すテストを探していますNULL

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

注意: いかなる状況でも、bash は変数が定義されていない、または変な値を持っていると文句を言うべきではありません。0、空、false、または未定義以外のものはすべて true とみなされます。

答え1

このようなテストは、Java や C# などの高級言語では存在しませんが、構築するのは比較的簡単です。

あなたの質問に対する 3 つのコメント:

1: bashでは「true」/「false」の文字値は扱えません。すべてのコマンドと条件文は、終了ステータス、 または論理的な結果は、0 (true) または 0 以外 (false) のいずれかです。
これを使用して作業し、車輪の再発明を試みないでください。

2: 環境変数でない限り、大文字のパラメータ名を使用しないようにしてください。これは、コードをきれいに保つのに役立つ単純な規則です。

3: 「NULL」とは具体的に何を意味しますか? リテラル文字列ヌル、空の値、それとも何か他のものでしょうか?
後者の2つの概念はbashには存在しません。ヌル変数は設定されていないため、すでに確認しています。

最も効果的な解決策は、変数 (または bash ではパラメーターと呼びます) を受け入れ、それらの条件をチェックし、それに基づいて終了ステータスを設定し、複数の真理値を実質的にリテラル 0 または 1 に凝縮する関数です。

例えば:

is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }

  • is_true "1"0を返すので、これは正しい。
  • is_true "false"1 となり、これは偽である。
  • a=10; is_true "$a"0 を生む
  • grep -q something somefilesomethingに少なくとも 1 回出現する場合は 0 を返しますsomefile

後者の例は、そのような構造は必要ないことを明確に示していることに注意してください。bashで起こることはすべてすでにこれらの基本的な 0/1 真理値を扱います。

しかし、何らかの厄介な外部プログラムからの入力を変換する必要があるかもしれないことは認めます :)

答え2

これらの比較は、コードの外観を不明瞭かつわかりにくくするため、役に立たないと思います。私は、man ページにある、バージョン 4.2 以降に導入された bash の優れた機能を使用しています。

   -v varname
          True if the shell variable varname is set (has been assigned a value).

使い方はとても簡単です

OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
    exec > &>./logfile
fi

つまり、有効としてフラグを設定するには、定義するだけです。試してみてください。

$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && :          # no output
$ unset VAR && VAR= && :  # "existed"
$ unset VAR && VAR=1 && : # "existed"

答え3

正規表現マッチングを使用して、3 つのチェックすべてを実行できます (未定義のパラメーターは空の文字列に解決されます)。

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)

関連情報