Bash: два условия в if

Я пытаюсь написать сценарий, который будет читать два варианта, и если оба из них будут "y", я хочу, чтобы он сказал: "тест сделан!"и если один или оба из них не будут "y", я хочу, чтобы он сказал: "тест не удался!" Вот что я придумал:--2-->

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

но когда я отвечаю на оба вопроса с "y", он говорит: "тест не удался!"вместо" тест сделан!". И когда я отвечаю на оба вопроса с "n", это говорит: "тест сделан!- что я сделал не так ?

8 ответов


вы проверяете неправильное состояние.

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

приведенное выше утверждение истинно, когда choice!='y' и choice1!='y', и поэтому программа правильно печатает "Тест Сделали!".

исправленный скрипт

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

программа делает именно то, что вы ей сказали. Вы сказали: "Если первый выбор не равен "y", а второй выбор не равен "y", то напечатайте " тест выполнен ! тест "в противном случае печать" не удался !- ... так что только в том случае, если оба варианта не y будет " тест сделан !"быть напечатанным.

вы, вероятно, имели в виду:

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

сменил != Не равно == равных. Теперь, только если вы ответите " y "на оба вопроса, будет" тест сделан !"быть напечатанным.


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

у вас обратная логика; вы проверяете != когда вы должны проверять для ==. Попробуйте это:

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

что, если вы попытаетесь

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

эта строка

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

проверяет, если оба варианта не "y", поэтому, когда оба варианта"y", утверждение ложно, и ваша программа правильно печатает "Test Failed"


вы получили логику сравнения назад; из вашего описания вы хотели сказать

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

Я действительно удивлен, что && construct работает, хотя при дальнейшем осмотре это, вероятно, должно. Тем не менее, я бы написал это как

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

еще одна мысль,

$ 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  
$  

переполнение абракадабра. (;