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' ] && [ "$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
$
переполнение абракадабра. (;