我想从用户那里获取输入,这可能是任何给定的选项,我尝试使用选择,但它只是进入循环,没有出来,是否有我可以让它出来并在用户输入正确的选项后继续,这里是示例代码:
select envir in "prod" "uat" "dev"; do
echo $envir
done
//continue with the script
echo "out of select"
一旦用户选择了任何可用选项,它就会出现并继续使用脚本,如果用户输入了其他内容,它应该继续提示。
答案 0 :(得分:3)
select envir in "prod" "uat" "dev"; do
echo $envir
if [ $envir == "prod" ] || [ $envir == "uat" ] || [ $envir == "dev" ]
then
break
fi
done
//continue with the script
echo "out of select"
答案 1 :(得分:2)
来自bash(1)手册页:
......列表已执行 在每次选择之后直到执行break命令。 select的退出状态是 列表中执行的最后一个命令的退出状态,如果没有命令执行则返回零 cuted。 ...
换句话说,当$ envir为非空时执行“break”语句。
答案 2 :(得分:1)
我会这样编写上面的脚本:
#!/bin/bash
declare -a opts=("prod" "uat" "dev")
echo "control-D to exit"
select envir in "${opts[@]}"; do
echo "envir=$envir"
found=0
for elem in "${opts[@]}"; do
if [ "$elem" = "$envir" ]; then
found=1
break
fi
done
if [ "$found" -eq 1 ]; then
break
fi
done
echo "out of select"
这样您的关键字就可以在一个地方处理。每次在“prod”“uat”“dev”列表中添加新单词时,您无需在2个位置进行更改。
您还可以从外部文件中读取单词列表,并在此处将其分配给bash数组变量opts。
答案 3 :(得分:0)
谢谢Brian。根据您的意见,这就是我能够做到的:
select envir in "prod" "uat" "dev"; do
echo $envir
if [ "$envir" != "" ]
then
break
fi
done
//continue with the script
echo "out of select"