web-dev-qa-db-fra.com

Deux conditions dans if

J'essaie d'écrire un script qui lira deux choix, et si les deux seront "y", je veux qu'il dise "Test terminé!" et si l'un ou les deux ne sont pas "y", je veux qu'il dise "Échec du test!" Voici ce que j'ai trouvé:

echo "- Do You want to make a choice ?"
read choice

echo "- Do You want to make a choice1 ?"
read choice1

if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi

Mais quand je réponds aux deux questions par "y", cela dit "Échec du test!" au lieu de "Test terminé!". Et quand je réponds aux deux questions avec "n", cela dit "Test terminé!" ce que j'ai mal fait?

21
Andrzej Florek

Vous recherchez la mauvaise condition.

if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ];

L'instruction ci-dessus est vraie lorsque choice!='y' et choice1!='y', et donc le programme imprime correctement "Test terminé!".

Le script corrigé est

echo "- Do You want to make a choice ?"
read choice

echo "- Do You want to make a choice1 ?"
read choice1

if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
37
abhshkdz

Le programme fait exactement ce que vous lui avez dit de faire. Vous avez dit "Si le premier choix n'est pas égal à 'y' et le deuxième choix n'est pas égal à 'y', alors imprimez" Test terminé! "Sinon imprimez" Test échoué! "- donc seulement si les deux choix sont not y "Test Done!" sera imprimé.

Vous vouliez probablement dire:

echo "- Do You want to make a choice ?"
read choice

echo "- Do You want to make a choice1 ?"
read choice1

if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi

J'ai changé != n'est pas égal à == équivaut à. Maintenant, seulement si vous répondez "y" aux deux questions, "Test terminé!" être imprimé.

3
idz
if [ "$choice" != 'y' -a "$choice1" != 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
1
PasteBT

Vous avez la logique de comparaison à l'envers; à partir de votre description que vous vouliez dire

if [ "$choice" = 'y' ] && [ "$choice1" = 'y' ]; then

Je suis en fait surpris que la construction de && fonctionne, même si, après une inspection plus approfondie, elle le devrait probablement. Pourtant, je l'écrirais comme

if [ "$choice" = 'y' -a "$choice1" = 'y' ]; then
1
Christian Stieber

Vous avez renversé votre logique; vous vérifiez! = quand vous devriez vérifier ==. Essaye ça:

if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
1
jlehr

Une autre pensée,

$ c1='y' ; c2='y' ; [[ ${c1} = 'y' ]] && [[ ${c2} = 'y' ]] && echo true || echo false  
true  
$ c1='n' ; c2='y' ; [[ ${c1} = 'y' ]] && [[ ${c2} = 'y' ]] && echo true || echo false  
false  
$ c1='n' ; c2='y' ; [[ ${c1} = 'y' ]] || [[ ${c2} = 'y' ]] && echo true || echo false  
true  
$ c1='n' ; c2='n' ; [[ ${c1} = 'y' ]] || [[ ${c2} = 'y' ]] && echo true || echo false  
false  
$  

Débordement de charabia. (;

1
anonimous

Et si vous essayiez

if [[ "$choice" != 'y' && "$choice1" != 'y' ]]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
0
Skippy Fastol

cette ligne

if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ]; then

teste si les deux choix ARENT 'y', donc quand les deux choix SONT 'y', la déclaration est fausse et votre programme affiche correctement "Test a échoué"

0
cdk