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


15
#!/bin/bash

VALUE=10

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

驚いたことに、これは「はい」を出力します。私はそれが必要になると期待していたでしょう[[ $VALUE -eq 10 ]]。のCONDITIONAL EXPRESSIONSセクションをスキャンしましたがman bash、この動作を説明するものが見つかりませんでした。

回答:


11

[[は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 ]]

常に真を返します

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

$ [[ 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")

予約語であることが算術評価を行うことを意味するのはなぜですか?私はどこにも文書化されたものを見つけることができません
Mikel

ああ、ここにある。gnu.org/software/bash/manual/…–
Mikel

man bash明確にするために、引用から引用まで含めました。
ラッシュ、

@Mikel [[予約語であるのは直接の事実ではありませんが、その中に[[ … ]]あるのは通常のコマンド構文ではなく、条件式であるためです。条件式では、などの算術演算子への引数-eqは算術評価の対象となります。
ジル 'SO-悪であるのをやめる

はい。私は、最初の文は誤解であるという考えを与えると言っていた
ミケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.