如何在Linux中退出select

toe95027  于 2023-05-22  发布在  Linux
关注(0)|答案(5)|浏览(323)

我想从用户那里获取输入,它可以是任何给定的选项,我试过使用 select,但它只是进入循环,不出来,有没有一种方法可以让它出来,并在用户输入正确的选项后继续,下面是示例代码:

select envir in "prod" "uat" "dev"; do
    echo $envir
done

//continue with the script
echo "out of select"

一旦用户选择了任何可用的选项,它应该出来,并继续与脚本,如果用户已经进入任何其他,它应该继续提示。

cgh8pdjw

cgh8pdjw1#

来自bash(1)手册页:
...列表在每次选择后执行,直到执行break命令。select的退出状态是列表中执行的最后一个命令的退出状态,如果没有执行任何命令,则为零。...
换句话说,当$envir非空时执行一个“break”语句。

luaexgnf

luaexgnf2#

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"
jmp7cifd

jmp7cifd3#

谢谢布莱恩。有了你的投入,这就是我所能做的:

select envir in "prod" "uat" "dev"; do
    echo $envir
    if [ "$envir" != "" ]
    then
        break
    fi
done

//continue with the script
echo "out of select"
xsuvu9jc

xsuvu9jc4#

我会这样写上面的脚本:

#!/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。

xggvc2p6

xggvc2p65#

在这些答案中应该有一个case语句的例子IMO,因为将它们与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"

相关问题