29

我正在尝试编写一个脚本来读取两个选项,如果它们都是“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”回答这两个问题时,它会说“测试完成!”

我做错了什么?

4

8 回答 8

48

您正在检查错误的条件。

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
于 2012-07-06T22:03:36.323 回答
3

该程序正在执行您告诉它执行的操作。你说“如果第一个选择不等于'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”时,才会“测试完成!” 被打印。

于 2012-07-06T22:07:26.667 回答
1

尝试:

if [[ "$choice" != 'y' && "$choice1" != 'y' ]]; then
    echo "Test Done!"
else
    echo "Test Failed!"
fi
于 2012-07-06T22:03:01.680 回答
1
if [ "$choice" != 'y' -a "$choice1" != 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
于 2012-07-06T22:04:04.933 回答
1

你把比较逻辑倒过来了;从你的描述中你想说

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

我实际上很惊讶 && 构造有效,尽管在进一步检查时它可能应该。不过,我会把它写成

if [ "$choice" = 'y' -a "$choice1" = 'y' ]; then
于 2012-07-06T22:05:43.843 回答
1

你的逻辑颠倒了;当您应该检查 == 时,您正在检查 !=。试试这个:

if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
于 2012-07-06T22:06:28.527 回答
1

另一个想法,

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

乱码泛滥。(;

于 2015-12-02T07:14:36.830 回答
0

线

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

测试两个选项是否都不是“y”,所以当两个选项都是“y”时,该语句为假,您的程序正确打印“测试失败”。

于 2012-07-06T22:04:59.223 回答