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?

user2649805
la source
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:

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

Essaye ça:

if [ $Server_Name -eq 1 ];then
Dave.d
la source
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.

Dennis
la source
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
Ranjithkumar T
la source
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

Tobibobi
la source
Il y a tellement de réponses incroyables ici ..
Tobibobi