GNU/Linux >> Linux の 問題 >  >> Linux

$なしの変数展開が式で機能するのはなぜですか?

#!/bin/bash

VALUE=10

if [[ VALUE -eq 10 ]]
then
    echo "Yes"
fi

驚いたことに、これは「はい」を出力します。 [[$ VALUE -eq 10]]が必要になると思っていました 。 CONDITIONAL EXPRESSIONSをスキャンしました man bashのセクション 、しかし私はこの振る舞いを説明するものを見つけられませんでした。

承認された回答:

[[ はbashの予約語であるため、 [の場合とは異なり、算術展開などの特別な展開ルールが適用されます。 。また、算術二項演算子 -eq 使用されている。したがって、シェルは整数式を探し、最初の項目でテキストが見つかった場合、それをパラメーターとして展開しようとします。これは算術展開と呼ばれ、 man bashに存在します 。

RESERVED WORDS
       Reserved words are words that have a special meaning to the shell.  
       The following words are recognized as reserved 
       …
       [[ ]]

[[ expression ]]
       Return  a  status  of 0 or 1 depending on the evaluation of 
       the conditional expression expression.  Expressions are 
       composed of the primaries 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.  

Arithmetic Expansion
       …
       The evaluation is performed according to the rules listed below 
       under ARITHMETIC EVALUATION.

ARITHMETIC EVALUATION
       …
       Within an expression, shell variables may also be referenced 
       by name without using the parameter expansion syntax.

たとえば:

[[ hdjakshdka -eq fkshdfwuefy ]]

常にtrueを返します

しかし、これはエラーを返します

$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")

再帰も利用できます:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")

Linux
  1. Chrome デベロッパー ツールで JavaScript を編集できないのはなぜですか?

  2. ブータブル USB の作成に 'dd' が機能しないのはなぜですか?

  3. setuid ビットの動作に一貫性がないのはなぜですか?

  1. 正規表現がXで機能するのに、Yでは機能しないのはなぜですか?

  2. 一部のコマンドでBashプロセス置換が機能しないのはなぜですか?

  3. BashスクリプトのRmコマンドは変数では機能しませんか?

  1. returnステートメントのないメイン関数が値12を返すのはなぜですか?

  2. find -exec mv {} ./target/ + が機能しないのはなぜですか?

  3. Tomcat がポート 8080 で動作するのに 80 で動作しないのはなぜですか?