Comment tester si une variable est égale à un nombre dans le shell


12

J'ai ce script shell qui ne fonctionne pas.

Contribution:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

Production:

Server Name is 1

Mais, si je change Server_Name=2, la sortie est:

Server Name is 1

Quand je change Server_Nameà 2, je veux dire: Server Name is 2.

Je sais que c'est la if [ $Server_Name=1 ];partie.

Comment je le répare?


Comme David le souligne ci-dessous, vous devez utiliser "-eq" pour tester les valeurs numériques. Vous pouvez également vouloir rechercher une variable vide pour éviter les erreurs; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

Réponses:


21

Votre script indique que vous utilisez des comparaisons de chaînes.

Supposons que le nom du serveur puisse être une chaîne au lieu d'un nombre uniquement.

Pour les comparaisons de chaînes :
if [[ "$Server_Name" == 1 ]]; then

Remarques:

  • Espacer == est un must
  • Espacer autour = est un must
    if [ $Server_Name=1 ]; then est faux

  • [[...]] réduit les erreurs car aucune expansion de nom de chemin ni aucun fractionnement de mot n'a lieu entre [[et]]

  • Préférez les guillemets qui sont des "mots"

Pour les comparaisons entières :
if [[ "$Server_Name" -eq 1 ]]; then


Plus d'information:


2
[[est la syntaxe bash et l'OP posait des questions sur le shell, où cela ne fonctionnerait pas
gilad mayani


2
[ $Server_Name=1 ]

ne fonctionne pas comme prévu car la syntaxe à l'intérieur des crochets simples n'est pas spéciale à Bash. Comme d'habitude, la variable $Server_Nameest remplacée par 1, donc toute la commande test ( [) voit est un seul argument: la chaîne 1=1. Comme cette piqûre a une longueur non nulle, le test renvoie vrai .

Pour les shells compatibles POSIX, vous pouvez utiliser les commandes de test suivantes :

[ "$Server_Name" = 1 ]

vérifie que le $Server_Nameest égal à la chaîne 1.

[ "$Server_Name" -eq 1 ]

vérifie que $Server_Nameest égal au nombre 1 , c'est-à-dire qu'il effectue une comparaison numérique au lieu d'une comparaison de chaînes.

La valeur de retour des deux commandes sera différente, par exemple, si vous définissez Server_Name=01. Le premier retournera faux, le second retournera vrai.

Notez que s'il existe une possibilité que la variable ne $Server_Namesoit pas définie, elle doit être citée ou test affichera une erreur lorsqu'elle sera invoquée.


1

Essayer,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

production:

 #./scriptname.sh
 Server Name is below 50

0

Réponse simple. Votre code est correct - presque. la seule chose qui vous manque, ce sont les espaces ... (et peut-être bien un "=" supplémentaire)

if [ $Server_Name=1 ]; then

ne calculera pas correctement.

if [ $Server_Name == 1 ]; then  

c'est ce que vous cherchez.

Et maintenant, la déclaration sur la chaîne par rapport aux nombres. Chaque fois que vous recherchez une comparaison comme est / n'est pas, alors == ira toujours bien.

Et je suppose que vous avez toujours un nom de serveur sous forme de chaîne, pas un nombre - non? ;-)

Bonne chance avec votre apprenti robuste de codage.

Ciao


Il y a tellement de réponses incroyables ici ..
Tobibobi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.