このbash条件チェックは[[-n..]]では機能しますが、[-n..]では機能しません。 [コピー]

このbash条件チェックは[[-n..]]では機能しますが、[-n..]では機能しません。 [コピー]

[ -n $value ]bash条件式に使用される長さ0の文字列を検出できないスクリプトがあります。

#!/usr/bin/env bash

value=""
if [ -n $value ]
then
    echo "value is non-zero"
fi

結果

0以外の値

[[ -n $value ]]つまり、次のように動作します。

#!/usr/bin/env bash

value=""
if [[ -n $value ]]
then
    echo "value is non-zero"
fi

を使用すると、[[予想される出力は生成されません。マニュアルページから:

   [[ expression ]]
      Return a status of 0 or 1 depending on the evaluation of the conditional expression expression.  Expressions are composed of the pri‐
      maries described below under CONDITIONAL EXPRESSIONS.  Word splitting and pathname expansion are not performed on the  words  between
      the  [[  and ]]; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process substitution,
      and quote removal are performed.  Conditional operators such as -f must be unquoted to be recognized as primaries.

私はこの行動を説明できません。長さ0の文字列が検出されたが検出されない
のはなぜですか?[[[

ベストアンサー1

これは[[次の理由による。表現する[議論それは次のように翻訳されています表現する

[[構文です - そうではありません組み込みコマンド[現状のまま[[複合コマンドそれよりも似て{いるか、もっと似ています。([

とにかく[[解析されたから横に $expansions、null拡張と欠落オペランドの違いを理解することは難しくありません。

[しかし、これは日常的な実行です。後ろにすべてのコマンドライン拡張が発生し、式を評価したときに何も拡張されなかったので、$null_expansion受け取られるのは、[ -n ]許可されていません有効な表現です。ここ[のように空でない単一引数の場合はtrueを返すように指定しますが、-n仕様はとても同じです。続けて… …

これら2つのコマンドは次のとおりです。

  test "$1"
  test ! "$1"

一部の過去のシステムでは安定して動作しません。これらの文字列式を使用してそれを既知の単項基本式$1に拡張すると、予期しない結果が生じる可能性があります。!((例えば-n。より良い構成は次のとおりです。

  test -n "$1"
  test -z "$1" 

どちらの形式にも長所と短所があります。[式を構成できます。外の拡張など:

[ "-${z:-n}" "$var" ]

...テストを構築するのに完全に有効な方法かもしれませんが、以下では機能しません。

[[ "-${z:-n}" "$var" ]]

...これは意味のない命令ですね。違いは、完全にテストが実行されるコマンドラインの解析ポイントによるものです。

おすすめ記事