web-dev-qa-db-fra.com

Testeur si une variable est égale à un nombre en shell

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

Sortie:

Server Name is 1

Mais si je change de Server_Name=2, le résultat est le suivant:

Server Name is 1

Quand je change Server_Name en 2, je veux qu'il dise: Server Name is 2.

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

Comment je le répare?

8
user2649805

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

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

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

Notes:

  • L'espacement autour de == est un doit
  • L'espacement autour de = est un doit
    if [ $Server_Name=1 ]; then est FAUX

  • [[...]] réduit les erreurs car aucun développement de chemin d'accès ou fractionnement de Word n'a lieu entre [[et]]

  • Préfère citer des chaînes qui sont des "mots"

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


Plus d'information:

15
Ivan Chau

Essaye ça:

if [ $Server_Name -eq 1 ];then
3
David Dai

Essayer,

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

sortie:

 #./scriptname.sh
 Server Name is below 50
1
Ranjithkumar T
[ $Server_Name=1 ]

ne fonctionne pas comme prévu car la syntaxe à l'intérieur des crochets simples n'est pas particulière à Bash. Comme d'habitude, la variable $Server_Name est remplacée par 1, ainsi toute la commande test ([) est un seul argument: la chaîne 1=1. Puisque cette corde a une longueur non nulle, test renvoie true .

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

[ "$Server_Name" = 1 ]

vérifie si le $Server_Name est égal à la chaîne 1.

[ "$Server_Name" -eq 1 ]

checks est que le $Server_Name est é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 est possible que la variable $Server_Name soit indéfinie, elle doit être citée ou test afficher une erreur lors de l'appel.

1
Dennis

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

if [ $Server_Name=1 ]; then

ne calculera pas correctement.

if [ $Server_Name == 1 ]; then  

est ce que vous cherchez.

Et maintenant la déclaration à propos de la chaîne par rapport aux nombres. Chaque fois que vous recherchez une comparaison comme is/is-not, alors == sera toujours correct.

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

Bonne chance avec votre apprenti costaud robuste.

Ciao

0
Tobibobi