$ Olmadan değişken genişletme ifadelerde neden çalışır?


15
#!/bin/bash

VALUE=10

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

Şaşırtıcı bir şekilde, bu "Evet" çıktı. Bunu gerektirecekti [[ $VALUE -eq 10 ]]. CONDITIONAL EXPRESSIONSBölümünü taradım man bash, ancak bu davranışı açıklayacak hiçbir şey bulamadım.

Yanıtlar:


11

[[bash ayrılmış kelimedir, bu nedenle aritmetik genişletme gibi özel genişletme kuralları uygulanır, durum böyle değil [. Ayrıca aritmetik ikili operatör -eqkullanılır. Bu nedenle kabuk tamsayı ifadesini arar ve ilk öğede metin bulunursa, bunu parametre olarak genişletmeye çalışır. Buna aritmetik genişleme denir ve içinde bulunur 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.

Yani mesela:

[[ hdjakshdka -eq fkshdfwuefy ]]

her zaman doğru dönecek

Ama bu hata döndürecek

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

Ayrıca özyineleme mevcuttur:

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

Ayrılmış bir kelime olmak neden aritmetik değerlendirme anlamına geliyor? Bunu hiçbir yerde belgelendiremiyorum
Mikel


Açıklamak için cevabımdan alıntıya yer man bashverdim.
acele

@Mikel Doğrudan [[ayrılmış bir sözcük değil, çünkü içeride [[ … ]]olan şey sıradan komut sözdizimi değil, koşullu bir ifade. Koşullu bir ifadede, aritmetik işleçlere yönelik argümanlar -eqaritmetik değerlendirmeye tabidir.
Gilles 'SO- kötü olmayı bırak'

Evet. İlk cümlenin yanıltıcı olan bu fikri verdiğini söylüyordum
Mikel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.