如果声明操作不起作用?

时间:2014-04-14 18:57:10

标签: linux bash if-statement

此功能无效。我似乎使用了太多的操作。它可以工作到第二个II或操作,然后它停止在第三个和第四个工作。所以我注释掉的那条线不起作用,但另一条线正在工作

不确定我做错了什么?我不想使用案例陈述;也许有更好的方法来做到这一点?我只需要调用此函数并确保用户输入正确。它不应该是空白的,它应该是其他三个条目之一

get_selection ()
{
count1=1
while [ $count1 = 1 ];
do
echo "enter user or service or item user|service|item :"
read entry
echo entry is $entry
#   if [ -z "$entry" ] || [ $entry != "user" ] || [ $entry != "service" ] || [ $entry!= "item" ]; then
if [ -z "$entry" ] || [ $entry != "user" ] || [  $entry != "service" ]; then
echo "blank or incorrrect entry"
else
echo "entry is correct "
count1=$(( $count1 + 1 ))
fi
done
}

3 个答案:

答案 0 :(得分:5)

无论entry的值是多少,它都将无法匹配“用户”或“服务”中的至少一个(即,它不能等于它们两者)。你想要

if [ -z "$entry" ] || { [ "$entry" != "user" ] && [ "$entry" != "service" ]; }; then

您可以使用case语句和不同的循环条件来简化功能:

get_selection () {
    while true; do
       echo "Enter user or service or item: "
       read entry
       case $entry in
           "") echo "blank entry" ;;
           user|service|item) echo "entry is correct"; break; ;;
           * ) echo "incorrect entry" ;;
       esac
    done
}

但是,您实际上是在重新创建select命令:

select entry in user service item; do
done

答案 1 :(得分:3)

如果您不想使用案例,可以使用:

get_selection ()
{
   count1=1
   while [ $count1 = 1 ]; do
      echo "enter user or service or item user|service|item :"
      read entry
      echo entry is $entry

      if [[ -z "$entry" ]] || [[ ! $entry =~ (user|service|item) ]]; then
         echo "blank or incorrrect entry"
      else
         echo "entry is correct "
         count1=$(( $count1 + 1 ))
      fi
   done
}

但我还是会推荐这个案子:

get_selection ()
{
   count1=1
   while [ $count1 = 1 ]; do
      echo "enter user or service or item user|service|item :"
      read entry
      echo entry is $entry

      case $entry in
         user|service|item)
               echo "entry is correct "
               count1=$(( $count1 + 1 ))
               break
               ;;
         *)
               echo "blank or incorrrect entry"
      esac

   done
}

您正在检查的内容清楚明了。

答案 2 :(得分:1)

补充@chepner和@ naab的有用答案:

充分利用bash的[[ ... ]]条件(与[ ... ]相比),您原来的if语句可以写成:

if [[ ! ($entry == "user" || $entry == "service") ]]; then
  echo "blank or incorrrect entry"
else
  echo "entry is correct "
fi

请注意,我们无需测试$entry是否为空(使用-z "$entry"),因为您只对该条目是否与您的某个关键字匹配感兴趣(以及您的错误消息涵盖无效输入和空输入情况。)