[/test

[/test

だから私はGITに初めて触れたので、bashコマンドとスクリプトに初めて触れたので、さまざまな構文とスクリプトの助けを探していました。今私はたくさんの助けを得て、Gitの経験をはるかに楽しくするスクリプトとエイリアスを作ることができました。

しかし、特に「if」コマンドに関連する微妙な違いが見つかりました。

if [ -z $1 ] ; #<- Zero length string
if [[ -z $1 ]] ; #<- Also Zero Length String
if [[ "$1" == -* ]] ; #<- Starts with - (hyphen)


if [ -z $1 ] && [ -z $2 ] ; #<- both param 1 & 2 are zero length
if [[ -z $1 ]] && [[ -z $2 ]] ; #<- Also both param 1 & 2 are zero length
if [[ "$1" == -* ]] || [[ "$2" == -* ]] ; #<- Either param 1 or 2 starts with -

if [ "$1" == -* ] || [ "$2" == -* ] ; #<- Syntax Failure, "bash: ]: too many arguments"

なぜ違いがありますか? [[(二重精度)が必要な時期と[(単精度)が必要な時期をどのように知っていますか?

Jaeden "Sifo Dyas" al Raec Ruinerに感謝します。

ベストアンサー1

まず、両方のタイプの括弧が構文の一部ではないことに注意してください if。代わりに:

  • [組み込みシェルの別の名前ですtest
  • [[ ... ]]構文と意味が異なる別々の組み込み関数です。

以下はbash文書から抜粋したものです。

[/test

test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  Unary
    expressions are often used to examine the status of a file.  There
    are string operators and numeric comparison operators as well.

    The behavior of test depends on the number of arguments.  Read the
    bash manual page for the complete specification.

    File operators:

      -a FILE        True if file exists.
      (...)

[[ ... ]]

[[ ... ]]: [[ expression ]]
    Execute conditional command.

    Returns a status of 0 or 1 depending on the evaluation of the conditional
    expression EXPRESSION.  Expressions are composed of the same primaries used
    by the `test' builtin, and may be combined using the following operators:

      ( EXPRESSION )    Returns the value of EXPRESSION
      ! EXPRESSION              True if EXPRESSION is false; else false
      EXPR1 && EXPR2    True if both EXPR1 and EXPR2 are true; else false
      EXPR1 || EXPR2    True if either EXPR1 or EXPR2 is true; else false

    When the `==' and `!=' operators are used, the string to the right of
    the operator is used as a pattern and pattern matching is performed.
    When the `=~' operator is used, the string to the right of the operator
    is matched as a regular expression.

    The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
    determine the expression's value.

    Exit Status:
    0 or 1 depending on value of EXPRESSION.

簡単に言えば、[bash式は正常に処理され、補間などを避けるために引用されなければなりません。したがって、$foo空の文字列か設定されていないかをテストする正しい方法は次のとおりです。

[ -z "$foo" ]

または

[[ -z $foo ]]

最初のケースでは、参照が重要です。これはfoo="a b" 、次のテストを設定すると、2つのパラメータを受け取った[ -z $foo ]結果がtest -z正しくないためです。

言語は[[ .. ]]異なり、bashよりも高いレベルの言語で期待できる方法で変数を正しく理解します。そのため、[classic / よりエラーが発生する可能性が少なくなりますtest

おすすめ記事