GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué la expansión variable sin $ funciona en expresiones?

#!/bin/bash

VALUE=10

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

Para mi sorpresa, esto da como resultado "Sí". Habría esperado que requiriera [[ $VALUE -eq 10 ]] . He escaneado las CONDITIONAL EXPRESSIONS sección de man bash , pero no encontré nada que explicara este comportamiento.

Respuesta aceptada:

[[ es una palabra reservada de bash, por lo tanto, se aplican reglas de expansión especiales, como la expansión aritmética, no como en el caso de [ . También operador binario aritmético -eq se usa Por lo tanto, Shell busca una expresión entera y si encuentra texto en el primer elemento, intenta expandirlo como parámetro. Se llama expansión aritmética y está presente en 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.

Entonces, por ejemplo:

[[ hdjakshdka -eq fkshdfwuefy ]]

devolverá siempre verdadero

Pero este devolverá un error

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

También está disponible la recursividad:

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

Linux
  1. ¿Por qué la expresión regular funciona en X pero no en Y?

  2. Linux:¿por qué no funciona Setuid?

  3. Linux – ¿Por qué Locale Es_mx funciona pero no Es?

  4. ¿El comando Rm en Bash Script no funciona con variables?

  5. Ssh:¿cómo funciona TCP-keepalive en Ssh?

¿Qué es el comando Grep en Linux? ¿Por qué se usa y cómo funciona?

¿Por qué find -exec mv {} ./target/ + no funciona?

ZFS bajo Linux, ¿funciona?

La repetición automática no funciona

¿Por qué el bit setuid funciona de manera inconsistente?

¿Por qué find -mtime no funciona como se esperaba en archivos con diferentes zonas horarias?