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"
#!/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"
PS3="Select and environment: "
select envir in "prod" "uat" "dev"; do
case $envir in
prod|uat|dev)
echo $envir
break
;;
*)
echo -e "\nUncrecognized input. Select a number\n"
;;
esac
done
# continue with the script
echo "out of select"
5条答案
按热度按时间cgh8pdjw1#
来自bash(1)手册页:
...列表在每次选择后执行,直到执行break命令。select的退出状态是列表中执行的最后一个命令的退出状态,如果没有执行任何命令,则为零。...
换句话说,当$envir非空时执行一个“break”语句。
luaexgnf2#
jmp7cifd3#
谢谢布莱恩。有了你的投入,这就是我所能做的:
xsuvu9jc4#
我会这样写上面的脚本:
这样,您的关键字在一个地方处理。每次你在“prod”“uat”“dev”列表中添加一个新词时,你不需要在2个地方进行更改。
您也可以从外部文件中读取单词列表,并在此处将其分配给bash数组变量opts。
xggvc2p65#
在这些答案中应该有一个case语句的例子IMO,因为将它们与select语句配对是非常常见的。