2013-02-27 6 views
2

Pour le script ci-dessous, je m'attends à ce que la sortie soit msg_y and msg_z. Mais il est l'impression msg_x and msg_z. Quelqu'un peut-il m'expliquer ce qui se passe?Sortie inattendue dans le script shell bash

#!/bin/bash 
set -x 

vr=2 
echo $vr 
if [ $vr > 5 ] 
then 
     echo "entered 1st if" 
     echo "msg_x" 

     echo "out of 1st if" 

     if [ $vr < 8 ]; then 
     echo "in of 2nd if" 
     echo "msg_y" 

     else 
     echo "msg_z" 
     fi 

else 
     if [ $vr > 1 ]; then echo "msg_y" 

     else echo "msg_z" 
     fi 
fi 

Répondre

6

Cette expression

[ $vr > 5 ] 

est en cours d'analyse comme une redirection de sortie; vérifiez pour voir si vous avez un fichier nommé "5" maintenant. La redirection de sortie est vide. Notez que l'avertissement habituel pour citer des paramètres à l'intérieur d'une expression de test n'aiderait pas ici (mais c'est toujours une bonne idée).

Vous pouvez échapper à la > afin qu'il soit considéré comme un opérateur dans la commande de test:

if [ "$vr" \> 5 ]; then 

ou vous pouvez utiliser l'opérateur de comparaison entier -gt

if [ "$vr" -gt 5 ]; then. 

Puisque vous utilisez bash , vous pouvez utiliser l'expression conditionnelle plus robuste

if [[ $vr > 5 ]]; then 

ou

if [[ $vr -gt 5 ]]; then 

ou utiliser une expression arithmétique

if ((vr > 5)); then 

faire vos comparisions (de même pour les autres).


Note: bien que je l'ai montré comment faire > travail comme opérateur de comparaison, même quand ils sont entourés par des entiers, ne pas le faire. La plupart du temps, vous n'obtiendrez pas les résultats que vous voulez, puisque les arguments sont comparés lexicographiquement, pas numériquement. Essayez [ 2 \> 10 ] && echo What? Utilisez les opérateurs de comparaison d'entiers corrects (-gt et autres) ou utilisez une expression arithmétique.

+0

une telle réponse solide! – TopGunCoder

+0

Tant de solutions possibles! :) – chepner

+0

C'est une explication très claire. Appréciez-le. Et oui un fichier appelé "5" a été créé. – itsh

Questions connexes