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?
linux
bash
shell
shell-script
user2649805
la source
la source
if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
Réponses:
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 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:
la source
[[
est la syntaxe bash et l'OP posait des questions sur le shell, où cela ne fonctionnerait pasEssaye ça:
la source
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_Name
est remplacée par 1, donc toute la commande test ([
) voit est un seul argument: la chaîne1=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 :
vérifie que le
$Server_Name
est égal à la chaîne1
.vérifie que
$Server_Name
est égal au nombre1
, 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_Name
soit pas définie, elle doit être citée ou test affichera une erreur lorsqu'elle sera invoquée.la source
Essayer,
production:
la source
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)
ne calculera pas correctement.
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
la source