Баш: два условия в if


Я пытаюсь написать сценарий, который будет читать два варианта, и если оба из них будут "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", это говорит: "тест не прошел!"вместо" тест сделан!". И когда я отвечаю на оба вопроса с "n", он говорит: "тест выполнен!- что я сделал не так ?

8 14

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 будет "тест выполнен !- быть напечатанным.

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

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

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

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  
$  

Переполнение тарабарщины. (;