2010-08-06 6 views
3

Supposons que j'ai la variable "x" dans bash. Comment puis-je tester si c'est un nombre?Quels sont les moyens de faire des tests numériques dans bash?

J'ai essayé if x=5; then echo "it is 5"; fi mais cela ne fonctionne pas,

alors j'ai essayé if x==5; then echo "it is 5"; fi mais cela ne fonctionne pas non plus,

alors j'ai essayé if [x==5]; then echo "it is 5"; fi mais cela ne fonctionne pas non plus,

alors j'ai essayé if [[x==5]]; then echo "it is 5"; fi mais cela ne fonctionne pas non plus,

puis j'ai essayé if [[x=5]]; then echo "it is 5"; fi mais cela ne fonctionne pas non plus,

alors j'ai essayé if [x=5]; then echo "it is 5"; fi mais cela ne fonctionne pas non plus,

alors j'ai essayé if [x -eq 5]; then echo "it is 5"; fi mais cela ne fonctionne pas non plus,

alors j'ai essayé if [[x -eq 5]]; then echo "it is 5"; fi et il a finalement fonctionné.

Je suis perdu. Bash semble être l'enfer. Pourquoi tant de façons n'ont pas fonctionné? Et seulement le dernier a fait?

Impossible d'adopter la syntaxe if x==5; then ...; fi?

Merci, Boda Cydo

Répondre

2

Essayez:

if [ "$x" = 5 ]; then echo "it is 5"; fi 

Notez que [ est une commande en elle-même; vous pouvez trouver qu'il est symétrique à test sur votre système. Donc, man test vous dit comment l'utiliser. En particulier, il est important de mettre un espace après.

+2

In bash, cependant, '[' et 'test' sont des built-ins. La commande '/ usr/bin/test' est ** presque ** identique, mais il y a quelques différences. Par conséquent, consultez 'help [' et 'help test' plutôt que' man test'. – Bolo

+0

Merci. Mais à quoi sert la citation? Pourquoi avez-vous cité «$ x»? – bodacydo

+1

@bodacydo: Quoting '" $ x "' empêche une erreur de syntaxe si '$ x' est vide. – ggg

1

dans bash devraient avoir un $ avant eux - if [${x} -eq 5] aurait dû travailler aussi.

+1

Non, ne fonctionnera pas. Il doit y avoir un espace après '[' et un avant ']': 'si [$ {x} -eq 5]' ou 'if [$ x -eq 5]' –

2

Bash ne peut pas adopter la syntaxe "if x == 5" pour avoir la sémantique que vous voulez parce que c'est déjà une syntaxe valide avec une signification différente. 'si x == 5; puis ...; fi 'met actuellement x à la valeur' ​​= 5 'puis exécute les commandes suivantes.

En ce qui concerne votre première question, je conseille d'éviter complètement la notation de parenthèse. Il suffit de faire

 
if test "$x" = 5; then 
... 
fi 

Notez également que « si le test x = 5 » sera toujours faux, puisque c'est une comparaison de la chaîne littérale « x » et la chaîne littérale « 5 ». Vous devez utiliser $ x pour obtenir la valeur de la variable.

+0

Merci, je ne le savais pas avant! – bodacydo

0

Impossible de bash adopter si x == 5; puis ...; Fi syntaxe?

Dans Bash, vous pouvez utiliser cette syntaxe qui vous permet d'omettre le signe du dollar et éviter d'utiliser -eq, il se rapproche le plus de ce que vous souhaitez utiliser:

if ((x == 5)) 

Vous pouvez même laisser les espaces si vous préférez:

if ((x==5)) 
0

vous pouvez utiliser le cas/ESAC

case "$x" in 
5) echo "x is 5";; 
esac 
1

La syntaxe sh est étonnamment flexible, et il est tout à fait possible d'obtenir la syntaxe souhaitée. Par exemple, si vous voulez écrire "if x == 5", vous devez juste réaliser que sh évaluera cette chaîne en invoquant une commande nommée 'x' avec les arguments '==' et '5', et réagir à la valeur renvoyée par cette fonction. Ce qui suit est probablement pas une bonne idée pour toute sorte de contexte de production, mais il peut être instructif de comprendre comment cela fonctionne:

 
#!/bin/sh 

declare() { 
    eval $1'() { 
    case $# in 
     0) test $'$1';; 
     1) false;; 
     *) case $1 in 
      =) shift; 
      '$1'=$(expr $*);; 
      ==) test "$'$1'" = $2;; 
      .=) '$1'="$'$1'$2";; 
      +=) '$1'=$(expr $'$1' + $2);; 
      -=) '$1'=$(expr $'$1' - $2);; 
      *) false;; 
     esac 
    esac 
    }' 
} 

declare x 
x = 5 
if x == 4; then echo not printed; fi 
if x == 5; then echo x = $x; fi # "x = 5" 
x += 2; 
if x == 5; then echo not printed; fi 
if x == 7; then echo x = $x; fi # "x = 7" 
x = foo 
x .= bar 
echo x = $x      # "x = foobar" 
x = 4 + 5 
echo x = $x      # "x = 9" 

La sortie du script ci-dessus est:

 
x = 5 
x = 7 
x = foobar 
x = 9 

+0

C'est un pur génie! Sensationnel. Juste wow! – bodacydo