「存在するかどうか」(false / true)の論理チェックではない場合、特定のコマンドを「保証」するために二重括弧を使用するのはなぜですか?

「存在するかどうか」(false / true)の論理チェックではない場合、特定のコマンドを「保証」するために二重括弧を使用するのはなぜですか?

最近、私は私のスクリプトの特定の行の後ろにあるシェル構文とロジックを増やすことを試みてきました。[[expression]]行の実行に何の価値ももたらさない例の目的は何ですか?したがって、スキップできますか?後ろの実際の式のみが使用されます[[]]

export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

私の仮定は、これがいくつかの値が欠落している場合(ヌルポインタ例外)、ある種のチェックだと思いますが、演算子は"[[]]"そのようなことをしないと思いますか?このスクリプトの目的は簡単です。 =>sdk端末でグローバルに使用できるようにエクスポートすることです。

答え1

これ-s file 条件式指定されたファイルが存在し、空でないことを確認してください。これ[[…]]複合コマンドは、二重角括弧で囲まれた式の評価に従って適切な状態で終了します。

だから

[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

$HOME/.sdkman/bin/sdkman-init.shソースは存在し、空でない場合にのみ提供されます。

export SDKMAN_DIR="$HOME/.sdkman"(別々の行にあるとします。)

答え2

私のローカルコンピュータでは、(そして経験として)「[」はbashの/usr/bin/testの別名です。確かに[[そうです。いいえ/usr/bin/test/usr/bin/test(間にスペースがないため)に拡張されます。 Bash(およびおそらく他のシェル)では、角括弧は/usr/bin/testを呼び出すのではなく、シェルの内部式評価器を使用する予約語です。

$HOME/.sdkman/bin/sdkman-init.sh変数を設定した後、ファイルの長さがゼロでない場合、ここにあるコードは現在のシェルで実行されます。私はこれの目的が何であるかわかりません(長さ0のファイルは実際には何もしないからです)。

関連情報