Bash if string = this或that

时间:2013-04-04 09:05:21

标签: linux bash shell ubuntu if-statement

尝试编写一个脚本,该脚本将读取用户输入的内容...我知道它是基本的,但是我坚持第一个如果...

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

我希望如果[$ backup =" y"或" n" ]

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

不是你实际问过的问题,但是......你告诉用户输入“是”或“否”但只测试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语句执行此操作,但如果可能有两种以上的替代方法,并且测试适合于大小写语法,我会发现案例更具可读性。

答案 2 :(得分:0)

您也可以尝试:

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

答案 3 :(得分:0)

我很好的解决方案是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

查看case statements了解详情。