';而';bash中的循环:不理解行为

';而';bash中的循环:不理解行为,bash,loops,Bash,Loops,我想强制人们在收到提示后传递某个字符串: while[[!${task}=~“向上|向下”];做 echo$任务 阅读-p“要执行的任务?[向上|向下]”输入 任务=$input 完成 虽然传递了正确的字符串,但仍然得到提示: Task to conduct? [up|down] down down Task to conduct? [up|down] up up Task to conduct? [up|down] 我遗漏了什么?您需要删除正则表达式周围的双引号。看起来他们在阻止扩张。这

我想强制人们在收到提示后传递某个字符串:

while[[!${task}=~“向上|向下”];做
echo$任务
阅读-p“要执行的任务?[向上|向下]”输入
任务=$input
完成
虽然传递了正确的字符串,但仍然得到提示:

Task to conduct? [up|down] down
down
Task to conduct? [up|down] up
up
Task to conduct? [up|down] 

我遗漏了什么?

您需要删除正则表达式周围的双引号。看起来他们在阻止扩张。这在我的盒子上可以用

#!/usr/bin/env bash
while [[  ! ${task} =~ ^(up|down)$ ]]; do
    read -p "Task to conduct? [up|down] " input
    task=$input
done

您可以运行它来自动检测常见问题,包括这个问题。不要引用正则表达式。此外,该模式将匹配任何只包含“向上”或“向下”的内容。可能重复的问题:顺便说一句,更方便的方法是使用
case
语句。如:
case$task in up | down)echo“task name is valid”;*)echo“任务名称无效”;;esac
——即使使用基准标准
/bin/sh
^(向上|向下)$
也更为正确。当前的正则表达式是非锚定的,因此它会考虑<代码>倒置< /代码>是一个有效的答案。它应该是
echo“$task”
——否则
*
将被文件名列表替换,f/e.@charles duffy感谢您对regex的更正。我会更正我的帖子。我收到的回音只是用来调试的