此功能无效。我似乎使用了太多的操作。它可以工作到第二个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
}
答案 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"
),因为您只对该条目是否与您的某个关键字匹配感兴趣(以及您的错误消息涵盖无效输入和空输入情况。)