2017-09-03 3 views
0

J'ai écrit ce script pour comparer 2 nombres dans bash mais cela me donne des réponses fausses pour certains nombres. comme si je lui donne 2 & 2 pour l'entrée, il me donne "X est supérieur à Y"Comparer des nombres dans les scripts bash

#!/bin/bash 
read num1 
read num2 
if [ $num1 > $num2 ] 
    then 
     echo "X is greater than Y" 
elif [ $num1 < $num2 ] 
    then 
     echo "X is less than Y" 
elif [ $num1 = $num2 ] 
    then 
     echo "X is equal to Y" 
fi 
+0

Pour comparer les numéros, utilisez '' opérateur pour -gt'> ',' '-lt' pour <' et '-eq' pour '=' – anubhava

+0

@anubhava mais il donne une mauvaise réponse pour l'entrée "2 et 3" – Kiana

Répondre

1

Cela fonctionne pour moi:

cmp() { 
    num1="$1" 
    num2="$2" 

    if [ $num1 -gt $num2 ] 
     then 
      echo "X is greater than Y" 
    elif [ $num1 -lt $num2 ] 
     then 
      echo "X is less than Y" 
    elif [ $num1 -eq $num2 ] 
     then 
      echo "X is equal to Y" 
    fi 
} 

Puis voir les résultats:

cmp 2 3 
X is less than Y 

cmp 2 2 
X is equal to Y 

cmp 2 1 
X is greater than Y 

Puisque vous utilisez bash, je vous suggère d'utiliser [[ ... ]] au lieu de [ ... ] parenthèses.

2

Vous pouvez essayer des contextes arithmétiques bash:

#!/bin/bash 
read num1 
read num2 
if ((num1 > num2)) 
    then 
     echo "X is greater than Y" 
elif ((num1 < num2)) 
    then 
     echo "X is less than Y" 
elif ((num1 == num2)) 
    then 
     echo "X is equal to Y" 
fi 
0
#!/bin/sh 

echo hi enter first number 
read num1 

echo hi again enter second number 
read num2 

if [ "$num1" -gt "$num2" ] 
then 
    echo $num1 is greater than $num2 
elif [ "$num2" -gt "$num1" ] 
then 
    echo $num2 is greater than $num1 
else 
    echo $num1 is equal to $num2 
fi 

(S'il vous plaît noter que nous utiliserons pour l'opérateur -gt>, -lt pour <, == for =)

+0

Concernant la dernière ligne: non, vous utilisez '-eq' pour l'égalité numérique dans' [...] ', pas' == '. – Kusalananda

0

Pour faire aussi peu de changements que possible double les parenthèses - pour entrer le mode 'double bracket' (est seulement valide dans bash/zsh pas dans le shell Bourne).

Si vous voulez être compatible avec sh, vous pouvez rester en mode 'single bracket' mais vous devez remplacer tous les opérateurs.

Dans 'single bracket' les opérateurs de mode comme '<','>', '=' sont utilisés uniquement pour comparer les chaînes. Pour comparer les chiffres en mode 'single bracket' vous devez utiliser '-gt', '-lt', '-eq'

#!/bin/bash 
read num1 
read num2 
if [[ $num1 > $num2 ]] 
    then 
     echo "X is greater than Y" 
elif [[ $num1 < $num2 ]] 
    then 
     echo "X is less than Y" 
elif [[ $num1 = $num2 ]] 
    then 
     echo "X is equal to Y" 
fi