GNU/Linux >> Znalost Linux >  >> Linux

Proč variabilní expanze bez $ funguje ve výrazech?

#!/bin/bash

VALUE=10

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

K mému překvapení z toho vychází „Ano“. Očekával bych, že to bude vyžadovat [[ $VALUE -eq 10 ]] . Naskenoval jsem CONDITIONAL EXPRESSIONS sekce man bash , ale nenašel jsem nic, co by toto chování vysvětlilo.

Přijatá odpověď:

[[ je bash vyhrazené slovo, proto se použijí speciální pravidla rozšíření, jako je aritmetické rozšíření, ne jako v případě [ . Také aritmetický binární operátor -eq se používá. Shell proto hledá celočíselný výraz a pokud je u první položky nalezen text, snaží se jej rozšířit jako parametr. Říká se tomu aritmetická expanze a je přítomna v 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.

Takže například:

[[ hdjakshdka -eq fkshdfwuefy ]]

vrátí vždy true

Ale toto vrátí chybu

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

K dispozici je také rekurze:

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

Linux
  1. Proč hlavní funkce bez příkazu return vrací hodnotu 12?

  2. Proč nefunguje find -exec mv {} ./target/ +?

  3. Proč 'dd' nefunguje pro vytvoření bootovatelného USB?

  1. Proč substituce procesu Bash nefunguje s některými příkazy?

  2. Proč tento regulární výraz nefunguje na linuxu?

  3. Proč find -mtime nefunguje podle očekávání u souborů s různými časovými pásmy?

  1. Ssh – Jak funguje Tcp-keepalive v Ssh?

  2. Proč Tomcat pracuje s portem 8080, ale ne s 80?

  3. Proč `\d` nefunguje v regulárních výrazech v sed?