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?
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
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é.
if [ "$choice" != 'y' -a "$choice1" != 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
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
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
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. (;
Et si vous essayiez
if [[ "$choice" != 'y' && "$choice1" != 'y' ]]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
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é"