如果声明操作不起作用?

the*_*lat 1 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
}
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

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

if [ -z "$entry" ] || { [ "$entry" != "user" ] && [ "$entry" != "service" ]; }; then
Run Code Online (Sandbox Code Playgroud)

您可以使用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
}
Run Code Online (Sandbox Code Playgroud)

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

select entry in user service item; do
done
Run Code Online (Sandbox Code Playgroud)