如何在bash中检查多个可接受选项中的一个?

如何在bash中检查多个可接受选项中的一个?,bash,shell,Bash,Shell,我试图验证输入变量的值,并提示用户输入有效值,直到得到有效输入('1'或'2')。我试过: while option not in 1 2 do : read -p "Please choose an option" option done 如何在bash中实现这一点?我会这样做: #!/bin/bash while : ; do echo "Please choose an option" read val [[ $val != 1 &a

我试图验证输入变量的值,并提示用户输入有效值,直到得到有效输入('1'或'2')。我试过:

while option not in 1 2
do :
    read -p "Please choose an option" option
done

如何在bash中实现这一点?

我会这样做:

#!/bin/bash

while : ; do
    echo "Please choose an option"
    read val
    [[ $val != 1 && $val != 2 ]] || break
done
经典的方法是:

while!{测试“$option”=1 | |测试“$option”=2;};执行…

但更简洁的方法是使用案例陈述:

while :; do
  case "$option" in 
    1|2) break ;;
    *) ... ;;
  esac
done

您可以在使用
{…}
列表构造和
shell globbing
时使用此

option=0

while [[ $(echo {1,2}) != *"$option"* ]]; do
    read -p "Please choose an option: " option
done

我认为这是最常见的方式

while [[ "$option" -ne 1 ]]  || [[ "$option" -ne 2 ]]; do
          read -p "Please choose an option" option
done

或者,如果您计划评估更多选项,请使用用例:

#!/bin/bash

while true; do
  read -p "Please choose an option" option

  case "$option" in
    [12]) break
          ;;
    *)    echo "whatever"
  esac
done

使用
选择
内置:

$ cat select.sh
#!/bin/bash

options=("Option 1" "Option 2")

echo "Please choose an option:"
select option in "${options[@]}"; do
        [ -n "${option}" ] && break
done
echo "You picked: ${option}"


bash
中,可以使用模式匹配来测试
$option

while [[ $option != [12] ]]; do
    read -p "Please choose an option: " option
done

谢谢它完成了任务,但希望找到逻辑“不属于数组”的东西。@Odin
bash
实际上没有这样的容器类型。数组实际上是引用的一种额外形式,可以使类似于
args=(“foo-bar”“12”);somecommand“${args[@]}”
可能(即,使用包含空格的2个参数而不是4个参数调用
somecommand
。@chepner yes true。我读了几篇关于这一点的帖子,这显然是不可行的。用这个逻辑。谢谢,这也行,但我不能胜过任何人。@odin现在你可以了…我在寻找更容易扩展和调试的东西。例如,将case/esac.+1用于正确的工具。;)您还可以通过设置
PS3
@chepner的值,在
select
提供的循环内提供更具描述性的提示:bash是否支持为select临时设置PS3的方法?使用
perl
我会编写
local PS3=“Your input>”
,但是
bash
有类似的功能吗?使用real命令,我可以编写
PS3=“Your input>”select…
,但事实证明
select
是一个shell关键字,您不能为关键字指定环境。除了
select
之外,没有任何东西使用
P3
,因此我认为不需要临时更改。只要将它设置为下一次
选择要使用的任何值即可。好的,这正是我想要的。谢谢
while [[ $option != [12] ]]; do
    read -p "Please choose an option: " option
done