GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi l'expansion variable sans $ fonctionne-t-elle dans les expressions ?

#!/bin/bash

VALUE=10

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

À ma grande surprise, cela affiche "Oui". Je m'attendais à ce qu'il nécessite [[ $VALUE -eq 10 ]] . J'ai scanné les CONDITIONAL EXPRESSIONS section de man bash , mais je n'ai rien trouvé pour expliquer ce comportement.

Réponse acceptée :

[[ est un mot réservé bash, donc des règles d'expansion spéciales telles que l'expansion arithmétique sont appliquées, pas comme dans le cas de [ . Également opérateur binaire arithmétique -eq est utilisé. Par conséquent, le shell recherche une expression entière et si du texte est trouvé au premier élément, il essaie de le développer en tant que paramètre. C'est ce qu'on appelle l'expansion arithmétique et est présent dans 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.

Ainsi, par exemple :

[[ hdjakshdka -eq fkshdfwuefy ]]

renverra toujours vrai

Mais celui-ci renverra une erreur

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

La récursivité est également disponible :

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

Linux
  1. Pourquoi la substitution de processus Bash ne fonctionne-t-elle pas avec certaines commandes ?

  2. Linux - Pourquoi Setuid ne fonctionne-t-il pas ??

  3. Linux – Pourquoi la locale Es_mx fonctionne-t-elle mais pas Es ?

  4. La commande Rm dans le script Bash ne fonctionne pas avec la variable ?

  5. Pourquoi find -exec mv {} ./target/ + ne fonctionne-t-il pas ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?

Pourquoi la modification de javascript dans les outils de développement Chrome ne fonctionne-t-elle pas ?

Pourquoi cette regex ne fonctionne-t-elle pas sous Linux ?

ZFS sous Linux, ça marche ?

La répétition automatique ne fonctionne pas

Pourquoi le bit setuid fonctionne-t-il de manière incohérente ?