7

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

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

我希望它是 if [ $backup = "y" or "n" ]

有任何想法吗?

4

4 回答 4

8

在 中使用此语法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
于 2013-04-04T09:08:22.187 回答
4

不是您实际提出的问题,而是...您告诉用户输入“是”或“否”,但只测试 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 开头的任何变化——通常这已经足够好了,但你可以加强测试。此外,由于您可能希望通过 yes 或 no 响应来做一些不同的事情,您可以扩展案例(我也加强了这个案例中的测试):

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 更具可读性。

于 2013-04-04T14:11:28.197 回答
2

你也可以试试:

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
于 2013-04-04T13:09:36.393 回答
0

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

检查案例陈述以获取更多信息。

于 2013-04-04T14:10:40.133 回答