如何在bash中检查多个可接受选项中的一个?
我试图验证输入变量的值,并提示用户输入有效值,直到得到有效输入('1'或'2')。我试过:如何在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
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
谢谢它完成了任务,但希望找到逻辑“不属于数组”的东西。@Odinbash
实际上没有这样的容器类型。数组实际上是引用的一种额外形式,可以使类似于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