Bash如果string=这个或那个

试图写一个脚本,将读取什么用户input…我知道这是基本的,但我卡在第一个如果..

echo "Please enter yes or no (y/n)?" read string if [ $string = "y" -o "n" ] then echo "User selected $string" else echo "You didn't enter y/n !!!" fi 

我希望它是如果[$备份=“Y”或“N”]

有任何想法吗?

不是你真正问的问题,但是…你告诉用户输入“是”或“否”,但只测试y或n – 确定,你给了他们一个提示,但用户是暗示抗性的。 所以也许一个宽松的测试是为了:

 echo "Please enter yes or no (y/n)" read string case "$string" in [yY]* | [nN]*) echo "User entered $string" ;; *) echo "I don't understand '$string'" ;; esac 

这将认识到以Y或N开始的任何变化 – 通常这足够好,但是可以加紧测试。 另外,既然你可能想要做一些不同的事情,你可以扩大案例(我也收紧了这个测试):

 case "$string" in [yY] | [yY][eE][sS]) echo "Here's where you process yes" ;; [nN] | [nN][oO]) echo "And here you deal with no" ;; *) echo "I don't understand '$string'" ;; esac 

你可以用if语句来做到这一点,但是如果有两个以上的选择是可能的,并且测试适用于case语法的话,我发现case更具可读性。

bash使用这个语法:

 if [ "a string" = "another one" ] ; then # Whatever fi 

对于多个条件语句(如OR ,请使用:

 if [ "a string" = "another one" ] || [ "$foo" = "bar" ] ; then # Whatever fi 

bash还支持非标准[[ ... ]]表达式,它可以使用单个命令处理复合比较,而不是2 [命令:

 if [[ "a string" = "another one" || $foo = "bar" ]]; then # Whatever fi 

你也可以尝试:

 echo "Please enter yes or no (y/n)?" read string if [[ "$string" =~ ^(y|n)$ ]] then echo "User selected $string" else echo "You didn't enter y/n !!!" fi 

我很好的解决方案是与case ,这是更容易延长,如果你想让你的投入更复杂

 case $string in y|n) echo "User selected $string" ;; *) echo "You didn't enter y/n !!!" ;; esac 

从那里你可以很容易地修改它接受大写或任何:

 case $string in y|Y) echo "yes, Sir!" ;; n|N) echo "No, can't do" ;; *) echo "Say what?" ;; esac 

检查病例报告了解更多信息。